阻塞队列BlockingQueue
FIFO队列(先进先出):LinkedBlockingQueue,ArrayBlockingQueue
优先级队列:PriorityBlockingQueue
阻塞队列提供了take和put方法:
如果队列为空则take阻塞,直到队列中有内容为止
如果队列为满,则put将阻塞,直到队列有空闲位置为止
JVM内存模型三大特性
原子性,可见性,有序性
原子性:
一个操作是不可中断的,即使是多个线程一起执行的时候,一个操作一旦开始就不会被其他线程干扰。
实现:AtomicInteger,synchronized互斥锁
可见性:
当一个线程修改了某一个共享变量的值,其他线程是否能立即知道这个修改动作。
实现:volatile synchronized final
有序性:
在本线程内观察,所有的操作都是有序的,在其他线程观察时,所有的操作的都是无序的。
实现:volatile关键字禁止指令重排,synchronized
线程安全的实现方式
1.不可变
不可变的对象一定是线程安全的,不需要在采取任何保障措施。多线程下尽量保证对象不可变来满足线程安全。
不可变的类型:
fianl关键字修饰的基本类型
String
枚举类型
包装类
互斥同步
synchronized和ReentrantLock
非阻塞同步
1.CAS:基于冲突检测的乐观并发策略
2.AtomicInteger:调用了CAS操作
3.ABA问题:一个变量初始值为A,被改成B后,又被改为A,会被误认为没被修改过。
锁优化
自旋锁:
让一个线程请求锁时,自旋一段时间,如果在这段时间能够获得锁,就可以避免进入阻塞状态。
锁消除:
对检测出不可能存在竞争上的共享数据的锁进行消除
锁粗化:
如果对同一对象反复进行加锁解锁操作会导致性能损耗,应较少的进行加锁
轻量级锁:
使用CAS操作避免重量级锁的互斥量开销
偏向锁:
偏向第一个获取锁对象的线程,让这个线程获取锁后不再需要进行同步操作