1,CAS的ABA问题
独占锁:是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。
乐观锁:每次不加锁,假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止。
各种乐观锁的实现中通常都会用版本戳version来对记录或对象标记,避免并发操作带来的问题。
2,保留字volatile的意义及作用及原理
轻量级synchronized,保证共享变量的可见性;可见性是指,一个线程修改这个变量时,另一个线程可以读到这个修改的值。
在多处理器下,为保证各个处理器的缓存是一致的,需要实现缓存一致性协议:每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当发现自己的缓存行对应的内存地址被修改了,就会将当前处理器的缓存行设置为无效行,当需要对这个数据进行操作的时候,会重新从内存将数据读取到缓存里面去。
volatile变量的第二个语义是禁止指令的重排序优化,普通变量仅仅会保证在该方法的执行过程中所有依赖赋值结果的地方都能获取到正确的结果,而不能保证变量赋值操作的顺序与代码中的执行顺序一致。
3,synchronized和lock的区别
都具有线程的可重入性,只是代码写法上的不同,一个表现在API从层面的互斥锁(lock(),unlock()方法配合try/finally语句块来完成),另一个表现为原生语法上的互斥锁。
功能上考虑: 相比synchronized,ReentrantLock增加了一些高级功能,主要有以下三项:等待可中断,公平锁,锁可以绑定多个条件。
性能上考虑:JDK1.5,多线程环境下,synchronized吞吐量下降的非常严重,Reentrylock则基本保持在同一个比较稳定的水平上。
JDK1.6发布后,synchronized与reentrylock的性能基本上是完全持平的,性能因素不在是选择Reentrylock的理由,提倡使用synchronized。
4,锁优化
适应性自旋
锁消除
锁粗化
轻量级锁
偏向锁
网友评论