当前位置:   article > 正文

Java中常用集合&线程安全的集合_java 线程安全的集合存放全局数据

java 线程安全的集合存放全局数据

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();
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/535181
推荐阅读
相关标签
  

闽ICP备14008679号