您的位置:首页 > 汽车 > 时评 > Java中syn锁状态

Java中syn锁状态

2024/10/6 5:48:57 来源:https://blog.csdn.net/qq_53199639/article/details/141758958  浏览:    关键词:Java中syn锁状态

原因:Monitor实现的锁属于重量级锁,里边涉及到了用户态和内核态的切换,进程的上下文切换,成本较高,性能差。

记录锁状态的位置:在 Java 对象头里,有一块结构,叫Mark Word,里面会记录锁的状态。Mark Word 会记录对象自身的运行数据,如哈希码、GC 分代年龄、锁状态标志、偏向时间戳(Epoch) 等。

锁有四种状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态

偏向锁状态:线程会在栈中新建一个锁记录Lock Record,锁记录中obj字段指向锁对象, 通过CAS指令将Lock Record的线程id存储在对象头的mark word中,同时也设 置偏向锁的标识为101,如果对象处于无锁状态则修改成功,代表该线程获得了偏向锁。

如果是当前线程已经持有该锁了,代表这是一次锁重入。设置Lock Record第部分为null,起到了一个重入计数器的作用。与轻量级锁不同的时,这里不会再次进行cas操作,只是判断对象头中的线程id是否是自己,因为缺少了cas操作,性能相对轻量级锁更好一些

轻量级锁状态: 在线程栈中创建一个Lock Record,将其obj字段指向锁对象。 通过CAS指令将Lock Record的地址存储在对象头的mark word中(数据进行交 换),如果对象处于无锁状态则修改成功,代表该线程获得了轻量级锁。

如果是当前线程已经持有该锁了,代表这是一次锁重入。设置Lock Record第一 部分为null,起到了一个重入计数器的作用。 每次锁重入都需要进行CAS

重量级锁状态: 对象头的Mark Word中就设置指向Monitor对象的指针 ,让对象与monitor关联,然后复述三个字段+字段存储的内容

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com