For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
我们在前几期的文章中给大家简单介绍了软件编程开发项目中常见的一些编程技术应用方式等内容,而本文我们就简单来学习一下,Java编程锁的实践阶段包含哪些。
1、无锁节点/偏向锁阶段
创建线程的时候在程序执行到同步代码块的时候,先会基于上面说到的内存分配策略进行分配内存,此时会当当前线程获取到了相关锁资源的时候,因为属于无锁状态下转换为偏向锁
会将相关的当前线程的线程ID赋值到相关的标记字段中。
为了提高性能以及栈空间可以获取相关的竞争数据,会将对象头的标记字段(Markword)拷贝到栈空间内部(LockRecord)锁记录。
2、轻量级锁阶段
竞争到锁的线程
与此同时,当另外一个线程同时也去竞争该资源的时候,需要进行竞争,因为在获取资源的时候,底层采用CAS机制取获取相关的资源标志,一旦获取成功,便可以通过偏向锁标识进行判断是否属于当前的锁owner线程。
当发现不属于偏向锁的线程进来竞争的时候,此时会产生竞争关系,因为同一时刻,只能允许一个线程获取资源,当前获取资源的线程会因为有其他线程也争抢过该资源,故此将java对象头中的锁字段改为00
未竞争到锁的线程
当发生线程争抢CAS机制失败的时候,会进行相关的自旋机制,进行尝试下一次进行争抢到锁。
3、重量级锁阶段
未竞争到锁的线程
当超过自旋的线程一直处于自旋,且超过了自旋阈值之后,变会升级成为了重量级锁。或
当更多的线程都处于争抢状态且属于自旋锁机制之后(出现了大量的轻量级锁之后),便会升级未重量级锁。
竞争到锁的线程
当锁标记因为发生变化,成为了重量级锁,所以,线程会同步自己的所记录,发现不一致,同步为重量级锁状态后,释放锁之后,进行唤醒阻塞的状态的线程。
锁的状态暂时处于重量级锁状态。接下来会专门写一篇文章讲解一下锁降级哦,锁降级会较为复杂,而且场景完全不一样,对JVM要求也不一样。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。