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 @   KeepSmiling_me  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示