一、线程安全
代码本身封装了所有必要的正确性保证手段,令调用这个无需关心多线程问题,更无需自己采取任何措施来保证多线程的正确调用。
1)线程安全的实现方法
-
互斥同步:synchronize、ReentrantLock。
-
非阻塞同步:CAS自旋,其中ABA问题一般不影响正确性。
-
无同步方案:可重入代码(传入相同的参数,就能返回相同的结果)、线程本地存储(ThreadLocal)
二、锁优化
自适应性自旋、锁消除、锁粗化、轻量级锁、偏向锁等
1)自旋锁与自适应自旋锁
-
自旋锁:线程在未获取到锁的时候,执行一个忙循环(自旋),而不去阻塞。阻塞的话,挂起线程与恢复线程都需要转入内核态完成,成本太高。
-
自适应性自旋:自旋“一段时间”后没有获取到锁,则挂起。这里的“一段时间”不是固定时间,会根据上一次在同一个锁上的自旋时间以及持有锁的线程的状态做决定。上次自旋时间短,则允许自旋的时间长点,线程状态不是运行,则自旋时间短点甚至不自旋直接挂起。
-
锁消除:即时编译器在运行时发现一些代码要求同步,但是被检测不存在共享数据竞争(逃逸分析),就会忽略掉同步。
-
锁粗化:将多个同步合并到一个里,减少加锁解锁带来的开销。
-
轻量级锁:通过mark word 与栈帧的lock record置换记录锁,释放锁则置换回来。
-
偏向锁:偏向线程,同线程则直接执行,无释放锁操作。
ps:途中粉色部分为不确定部分,望指点。