课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
锁的应用在java编程开发项目中应用频率还是非常高的,而今天我们就通过案例分析来了解一下,java编程锁的状态与类型。
1、java中锁状态的变化
为什么java中的锁有三种状态呢?其本质原因是为了提升锁的效率,因为不同情况下,锁的力度是不一样的。
通过设置不同的锁的状态,从而可以不同的情况用不同的处理方式。
2、偏向锁biasedlocking
一般来说,一个对象被一个线程获得锁之后,很少发生线程切换的情况。也就是说大部分情况下,一个对象只是被一个对象锁定的。
那么这个时候我们可以通过设置Markword的一定结构,减少使用CAS来更新对象头的频率。
3、轻量级锁thinlock
如果对象现在处于未加锁状态,当一个线程尝试进入同步块的时候,会将把对象头和当前对象的指针拷贝一份,放在线程的栈中一个叫做lockrecord的地方。
然后JVM通过CAS操作,将对象头中的指针指向刚刚拷贝的lockrecord。如果成功,则该线程拥有该对象的锁。
实际上LockRecord和Markword形成了一个互相指向对方的情况。
下次这个线程再次进入同步块的时候,同样执行CAS,比较Markword中的指针是否和当前thread的lockrecord地址一致,如果一致表明是同一个线程,可以继续持有该锁。
4、三种锁状态的不同
偏向锁,轻量级锁和重量级锁到底有什么不同了?
这里总结一下,偏向锁下次进入的时候不需要执行CAS命令,只做线程ID的比较即可。
轻量级锁进入和退出同步块都需要执行CAS命令,但是轻量级锁不会阻塞,它使用的是自旋命令来获取锁。
重量级锁不使用自旋,但是会阻塞线程。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。