java CAS原理,非锁方式同步线程
CAS(Compare-and-Swap) 即比较和交换
synchronized 同步机制是通过javac编译后的字节码指令monitorenter和monitorexit来实现的,同一时间只能有一个线程进入The Owner
monitor实际是依赖操作系统的mutex lock命令来实现的
synchronized升级
其实每个java 线程是操作系统线程的映射,所以每当线程挂起或唤醒时,都要切换操作系统从用户态到内核态,这种操作是比较重量级的,在一些情况下切换时间本身可能
超出线程执行任务的时间这样使用synchronized将会对程序的性能产生很严重的影响,所以jdk6开始进行了优化,出现了偏向锁,轻量级锁。

1.偏向锁
在对象头中mark word标记中:
如下所示,锁标志位为01,是否为偏向锁为1时,前面的线程id就是该锁偏向的线程

2.轻量级锁
如果线程id为多个时,升级为轻量级锁
轻量级锁会将在虚拟机栈中开辟一块内存为Lock Record的空间,存放对象头中mark word副本以及owner指针.
线程通过CAS获取锁,一旦获取成功就将mark word复制到lock Record中,并且将lock Record中的owner指针指向该对象,并且mark word中的前30字节将生产指向虚拟机栈中的lock Record.
此时如果有新的线程进入,则会开始自旋等待,当超过自旋默认次数时会升级成重量级锁

我只想安静地学习,捡拾前人的牙慧,默默强大如此弱小的我...

浙公网安备 33010602011771号