arrayList实现线程安全
时间: 2023-05-26 13:05:29 浏览: 117
Java中的ArrayList是线程不安全的,如果多个线程同时对ArrayList进行修改操作可能导致数据不一致或者出现异常。为了解决这个问题,可以使用以下几种方法实现线程安全的ArrayList:
1. 使用Collections的synchronizedList方法
```java
List list = Collections.synchronizedList(new ArrayList());
```
这种方法是将ArrayList转换成线程安全的List,它的原理是在每个方法中加上了synchronized关键字,从而保证了线程安全。但是这种方法有一个缺点,就是当多个线程同时执行操作时,只有一个线程能够访问List,其他线程需要等待,影响了程序效率。
2. 使用CopyOnWriteArrayList
```java
List list = new CopyOnWriteArrayList();
```
CopyOnWriteArrayList是Java并发包中提供的线程安全的List,它的原理是在对List进行修改操作时,会先复制一份List,然后在副本上进行操作,最后再将副本赋值给原来的引用。因为每次修改操作都是对副本进行的,所以不会影响到原来的List,从而保证了线程安全。但是这种方法有一个缺点,就是在进行修改操作时会创建一个新的副本,占用了一定的内存空间。
3. 使用Lock和Condition
```java
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class MyList {
private ArrayList<Integer> list;
private final Lock lock;
private final Condition notEmpty;
public MyList() {
list = new ArrayList<>();
lock = new ReentrantLock();
notEmpty = lock.newCondition();
}
public void add(int value) {
lock.lock();
try {
list.add(value);
notEmpty.signalAll();
} finally {
lock.unlock();
}
}
public int remove() throws InterruptedException {
lock.lock();
try {
while (list.size() == 0) {
notEmpty.await();
}
return list.remove(0);
} finally {
lock.unlock();
}
}
}
```
这种方法使用了Lock和Condition来实现线程安全,它的原理是在对List进行修改操作时,使用Lock来保证只有一个线程能够修改List,其他线程需要等待,直到修改完成后再唤醒它们。同时使用Condition来保证当List为空时,消费线程会等待生产线程向List中添加元素。
总之,以上三种方法都可以实现线程安全的ArrayList,不同的方法有不同的优缺点,在实际使用时需要根据具体情况选择适合的方法。
阅读全文