欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java中常用集合&线程安全的集合

程序员文章站 2022-07-12 20:57:51
...

Java中常用集合

Java中常用集合&线程安全的集合

(图中忽略中间接口)

Collection接口族下的对象都是存的单一值的元素,而Map接口族下存的是key-value结构的数据。其中Set集合需借助Map对象来实现。

线程安全的List

ArrayList和LinkedList都不是线程安全的,在多线程环境下存在线程安全问题。

1.Vector

Vector通过在方法上加上synchronized关键字修饰来实现线程安全,但Vector的线程安全仅限于单个操作,多个操作并不能保证线程安全。

2.Collections.synchronizedList()

通过List list = Collections.synchronizedList(new ArrayList());
拿到线程安全的List,其内部是通过装饰者模式使用synchronized代码块加锁。

3. CopyOnWriteArrayList

CopyOnWriteArrayList位于java.util.concurrent并发包下,实现List接口。Vector和Collections.synchronizedList()都对get方法加了锁,而CopyOnWriteArrayList没有对读加锁。因为写操作每次都要新建一个数组,把原数组拷贝过去,在末尾加上新增元素,最后替换原数组,以此来保证读写并发时不需要对读操作加锁也能保证线程安全,但每次都要新建数组,对写性能有影响。

public boolean add(E e) {
		// CopyOnWriteArrayList采用ReentrantLock加锁
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            int len = elements.length;
            // 每次都新建一个数组
            Object[] newElements = Arrays.copyOf(elements, len + 1);
            newElements[len] = e;
            setArray(newElements);
            return true;
        } finally {
            lock.unlock();
        }
    }
相关标签: Java 集合