公众号merlinsea
- 同步容器
- 同步容器:同步容器在java中包括有Vector,HashTable,Collections.syncronizedXXX
- 当多个线程去操作同一个同步容器的时候,调用这个同步容器的方法会持有同一把锁,在Vector中是持有this锁,在Collections.syncronizedXXX中是持有mutex锁。因此在多线程环境下可能存在线程不安全的问题
- 下面以Vector为例作为讲解:单线程环境下使用Vector同步容器:这种用法是没有问题的,不存在线程不安全的问题。但由于Vector每一方法都使用了syncronized的关键字,在这种情况下性能不如ArrayList集合。
public class VectorDemo { public static void main(String[] args) { Vector<String> stringVector = new Vector<>(); for (int i = 0; i < 1000; i++) { stringVector.add("demo" + i); } //正确迭代 Iterator<String> stringIterator = stringVector.iterator(); while (stringIterator.hasNext()) { String next = stringIterator.next(); if (next.equals("demo2")) { stringIterator.remove(); } } } }
多线程环境下使用Vector同步容器:这种用法存在线程安全问题
如何保证多线程环境下操作同一个Vector依旧是线程安全的呢?
外部额外加锁。 通常会选择锁住迭代器
public class VectorDemo { public static void main(String[] args) { Vector<String> stringVector = new Vector<>(); for (int i = 0; i < 1000; i++) { stringVector.add("demo" + i); } Iterator<String> stringIterator = stringVector.iterator(); for (int i = 0; i < 4; i++) { new Thread(() -> { synchronized (stringIterator) { while (stringIterator.hasNext()) { String next = stringIterator.next(); if (next.equals("demo2")) { stringIterator.remove(); } } } }).start(); } } }
综合上述的问题,
Vector在单线程环境下不存在线程安全问题,因此不需要内部每一个方法都加syncronized修饰,因此性能不如ArrayList集合。
Vector在多线程环境下存在线程安全问题,因此外部需要额外加锁保证线程安全,但外部额外加上了syncronized修饰,syncronized代码块中的函数其实也就没有必要在加锁了,因此在多线程环境下依旧可以通过包装ArrayList实现比vector性能更好的同步容器。
以上就是Vector为啥被废弃的原因。
- 并发容器
- 并发容器:并发容器在java中包括有CopyOnWrite系列,Concurrent系列和BlockingQueue系列
- 当多个线程去操作同一个并发容器的时候,会先拷贝一个并发容器的副本,然后对副本操作,最后根据cas操作进行判断然后写回原来的并发容器中。
- 下面是多线程操作同一个CopyOnWriteArrayList的例子(线程安全)
public class Demo { public static void main(String[] args) { CopyOnWriteArrayList<String> strings = new CopyOnWriteArrayList<>(); for (int i = 0; i < 1000; i++) { strings.add("demo" + i); } for (int i = 0; i < 4; i++) { new Thread(() -> { strings.forEach(e -> { if (e.equals("demo2")) { /** * 这里不会发生线程安全问题,remove操作是在副本中操作,然后再根据cas原理写回主存 */ strings.remove(e); } }); }).start(); } } }
vip算法班永久学习班: 800元/人
周一、周三、周五:8:30-9:30,周六、周日:10:30-11:30
报名方式:通过公众号导航栏的刷题群即可联系到我的微信号
vip算法班详情链接
奔跑的小梁,公众号:梁霖编程工具库算法训练营快来参加吧~