【面试|线程安全系列面试问题进阶】Volatile是什么轻量级的同步机制:可见性,不保证原子性,禁止指令重排
JVM JMM:Java内存模型 可见性 原子性 有序性
ArrayList线程不安全:报错异常:java.util.ConcurrentModficationException
导致原因:并发争抢修改导致。
解决方案:1.new Vector<>() 加了同步锁 但是降低并发性
2.Collections.synchronizedList(new ArrayList<>())
3.CopyOnWriteArrayList<>() 写时复制:CopyOnWrite是写时复制一个容器,将新元素添加到复制的容器中,再将元容器的引用指向新复制的容器
HashSet线程不安全:同上:
解决方案:Collections.synchronizedSet(new HashSet)
CopyOnWriteHashSet<>()
HashMap线程不安全:解决方案:Collections.synchronizedMapt(new HashMap)
ConcurrentHashMap<>()
CountDownLatch:让一些线程阻塞知道另一些线程完成后再被唤醒。
当一个线程调用await()方法时,调用的线程会被阻塞,其他线程调用CountDown:方法会将计数器减一,并且此线程不会被阻塞,当计数器值变为0时,调用await()方法的线程会被唤醒,继续执行。
CyclicBarrier:将一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障才会开门,所有被阻塞的线程才能继续干活,线程进入屏障通过CyclicBarrier的await()方法
Semphore:信号量主要用于两个:1多个共享资源互斥使用 2并发线程数的控制
推荐阅读
- Java核心知识|面试必问系列 --- 多线程安全问题
- 操作系统|面试必考 | 进程和线程的区别
- 多线程|wait和notify实现线程之间的通信
- 多线程|Java多线程基础(线程与进程的区别,线程的创建方式及常用api,线程的状态)
- 多线程|单例模式中的线程安全问题
- 服务器|分布式ID问题及解决方案
- sentinel|springCloud alibaba( Sentinel--服务容错)
- 面试|如何保证数据库和缓存双写一致性
- 分布式架构搭建|高并发下分布式ID各个的解决方案以及redis集群分布式ID代码实现