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.

此时如果有新的线程进入,则会开始自旋等待,当超过自旋默认次数时会升级成重量级锁

 

 

posted @ 2023-02-06 14:06  KeepSmiling_me  阅读(30)  评论(0)    收藏  举报