Java集合类线程安全

「爱情、让人受尽委屈。」 2022-09-06 01:19 387阅读 0赞

文章目录

  • ArrayList线程不安全
    • List线程安全解决方案
  • HashSet线程不安全
  • hashMap线程不安全

ArrayList线程不安全

ArrayList 线程安全问题,注意看源码

并未加锁

List线程安全解决方案

  1. Vector

jdk1.0已经引入,线程安全实现为synchronized

  1. Collections#synchronizedList,SynchronizedMap

源代码中Collections中自己内部类实现加锁机制。

如下部分代码:通过synchronized实现加锁线程安全

  1. public boolean isEmpty() {
  2. synchronized (mutex) {return c.isEmpty();}
  3. }
  4. public boolean contains(Object o) {
  5. synchronized (mutex) {return c.contains(o);}
  6. }
  7. public Object[] toArray() {
  8. synchronized (mutex) {return c.toArray();}
  9. }
  1. CopyOnWriteArrayList

在修改原数组时都会进行加锁,然后对原数组进行copy,再进行修改保证线程安全

  1. public E remove(int index) {
  2. synchronized (lock) {
  3. Object[] es = getArray();
  4. int len = es.length;
  5. E oldValue = elementAt(es, index);
  6. int numMoved = len - index - 1;
  7. Object[] newElements;
  8. if (numMoved == 0)
  9. newElements = Arrays.copyOf(es, len - 1);
  10. else {
  11. newElements = new Object[len - 1];
  12. System.arraycopy(es, 0, newElements, 0, index);
  13. System.arraycopy(es, index + 1, newElements, index,
  14. numMoved);
  15. }
  16. setArray(newElements);
  17. return oldValue;
  18. }
  19. }

源码分析

HashSet线程不安全

源码:未加锁

解决方案:CopyOnWriteArraySet,同理CopyOnWriteArrayList

hashMap线程不安全

HashMap?ConcurrentHashMap?相信看完这篇没人能难住你! 吐了。有复杂,要慢慢看

解决方案ConcurrentHashMap,原理上来说:ConcurrentHashMap 采用了分段锁技术,其中 Segment 继承于 ReentrantLock。不会像 HashTable 那样不管是 put 还是 get 操作都需要做同步处理,理论上 ConcurrentHashMap 支持 CurrencyLevel (Segment 数组数量)的线程并发。每当一个线程占用锁访问一个 Segment 时,不会影响到其他的 Segment。

发表评论

表情:
评论列表 (有 0 条评论,387人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线安全集合

    的方法,即当发现需要扩容时,创建一个新的数组,同时搬运几个元素过去,后续每次线程操作ConcurrentHashMap时,都会搬运元素,每次操作搬运一部分元素。,当读取顺...

    相关 线安全集合

    原来的集合类,大部分都是线程不安全的. > Vector,Stack,HashTable,是线程安全的(不建议用),其它的集合类不是线程安全的. 多线程使用ArrayLi