今天听了一节马士兵的公开课,对 锁的概念讲的很不错,记录下来备忘。
锁的概念是synchronized(object) 锁定对象;
锁有两种:
一种是乐观锁(即应用App层实现一个while循环compareandchange):即所有人都可以读取object,但当回写时,需要比对object是否还是之前读取的object,如果是,进行会写,如果不是,读取新的object,然后进入下一次循环。
乐观锁有2个问题:
1.ABA问题
ABA的问题在执行涉及到指针的操作时,很有可能导致虽然值(指针地址)没有发生变化;但值背后的意义已经发生了变化(例如地址中的内容发生了改变),解决办法是加一个版本来管理
2.compare和change行为没有原子性
JAVA通过lock_if_mp在总线上锁定对应的北桥信号以实现原子性
二种是系统实现的悲观锁(重量级锁):
OS层面通过等待队列进行调度,当一个thread拿到这个锁时,其他队列等待。
两种锁各有千秋,synchronize默认会使用乐观锁,当乐观锁达到一定的循环次数时,自动升级为悲观锁。
另外:synchornized在上锁前还有一个“偏向锁”,即第一个调用thread调用时 不加锁,而是直接将自己的指针赋值给这个object,规避加锁开销。当有第二个thread来申请该object时,撤销偏向锁升级为乐观锁。
注:锁的信息均存在于对象的OFFSET中的markdown:(8Byte)
001 无锁
00 轻量级锁 (前62位指向线程的lock record指针)
101 偏向锁 (前54位指向当前线程的指针)
10 重量级锁
11 GC标记消息