在本文中,让我们谈谈什么是锁,为什么需要锁定以及如何锁定。当然,我说的可能不足。欢迎大家在评论领域积极讨论。
并发实际上非常简单,并发是多线程并发访问,也就是说,有n个多个线程可以获得相同的资源。
当我们谈论的线程是多线程并发访问资源时,它们会确保其订单,因此如何确保订单?
锁定是确保并发顺序的一种手段,锁可以实现线程安全性。
实际上,锁定时需要考虑场景
乐观锁的本质不是锁定。我们认为遇到并发写作的可能性将非常低。每次我们思考时,我们都认为它不会被修改,因此不会被阻止,但是为了确保数据的一致性在我们写作时需要再次确认,并且我们获得了最新的数据。取另一个副本,然后再次验证它直到通过验证。
悲观的锁是认为更多的写作和阅读少。每次阅读和写数据时,您都会被锁定。让其他线程进入想要获得资源的阻止状态。直到当前线程获得资源来发布资源。
Java中常用的乐观锁定是CAS算法+自旋(需要考虑ABA问题,CPU性能)。
自适应自动螺旋锁(JVM优化旋转,您将选择最佳旋转时间,而不是保持CPU资源的消耗)
完成:
JDK1.5从一类AtomicStampedReference开始,以解决ABA问题。该类别的比较方法的作用是首先检查当前参考是否等于预期的参考,以及当前符号是否等于预期的符号。如果相同的情况相等,则在原子方法中将参考和徽标的值设置为给定的更新值。
还有一些基于版本编号来解决ABA问题,而版本号仅增加。
对于Java,同步关键字和锁的实现类是悲观的锁。
Retreenlock的原理基于AQS。AQS试图首先使用CAS旋转。如果未获得,它将转换为悲观的锁。
休闲锁通常需要通过阻止线程来实现。要更深入地了解悲观的锁,我们需要知道线程的状态。
线的状态,如下图所示:
