0
点赞
收藏
分享

微信扫一扫

代码 | 利用读写锁实现一个线程安全的ArrayList


​​转载本文章请标明作者​​《爱喝纯净水的南荣牧歌》​​


代码 | 利用读写锁实现一个线程安全的ArrayList_java

开始行动,你已经成功一半了,献给正在奋斗的我们


/**
* 使用读写锁实现的线程安全的List
*
* @author yanghang
*/
public class ReentrantLockList<T> {

// 默认的大小
private static final int DEFAULT_CAPACITY = 10;

// 线程不安全的List
private final List<T> array;

public ReentrantLockList() {
array = new ArrayList<>(DEFAULT_CAPACITY);
}

public ReentrantLockList(int initialCapacity) {
if (initialCapacity > 0) {
array = new ArrayList<>(initialCapacity);
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}

// 读写锁
private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private final Lock readLock = readWriteLock.readLock();
private final Lock writeLock = readWriteLock.writeLock();

// 添加元素
public void add(T t) {
writeLock.lock();
try {
array.add(t);
} finally {
writeLock.unlock();
}
}

// 删除元素
public void remove(T t) {
writeLock.lock();
try {
array.remove(t);
} finally {
writeLock.unlock();
}
}

// 获取数据
public T get(int index) {
readLock.lock();
try {
return array.get(index);
} finally {
readLock.unlock();
}
}

public int getSize() {
readLock.lock();
try {
return array.size();
} finally {
readLock.unlock();
}
}

static ReentrantLockList<String> reentrantLockList = new ReentrantLockList<>(20000);

public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
reentrantLockList.add(String.valueOf(i));
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
reentrantLockList.add(Thread.currentThread().getName());
}
});
Thread t3 = new Thread(() -> {
for (int i = 0; i < 100; i++) {
System.out.println(reentrantLockList.get(i));
}
});
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();

System.out.println(reentrantLockList.getSize());
}
}


代码 | 利用读写锁实现一个线程安全的ArrayList_多线程_02


举报

相关推荐

0 条评论