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.
此时如果有新的线程进入,则会开始自旋等待,当超过自旋默认次数时会升级成重量级锁
我只想安静地学习,捡拾前人的牙慧,默默强大如此弱小的我...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理