2016 - 2024

感恩一路有你

java 线程状态 java线程锁为什么锁不住?

浏览量:1128 时间:2021-03-24 16:09:41 作者:admin

java线程锁为什么锁不住?

主要问题没有给出完整的代码和运行结果,我分析这个代码没有问题,可以正确运行。

在这段代码中,使用了savemoney类对象的锁。这个对象在运行时只有一个实例,这确保了在代码执行时只有一个线程可以获得锁。其他线程必须等待锁保持线程释放锁,然后才能进入。因此,主体需要补充如何在无法锁定的情况下得出结论。

我还原了代码并给出了如下运行结果:

运行的代码应该与所有者的代码一致

运行结果表明三个线程互斥执行同步代码块。

欢迎批评指正。如果您认为答案是好的,请您称赞并注意^V^

Java并发线程的阻塞和唤醒可以分为以下几类:

它是基于JVM的对象头实现的。当多线程竞争相同的关键资源时,它们会根据不同的锁定机制(自旋锁、轻/重锁)阻塞和唤醒。

我跳过这里一会儿。一般的实现原理是基于对象的同步队列与AQS非常相似。

关注AQS(抽象队列同步器),因为这是JDK和契约实现的基础(如锁、阻塞队列、倒计时锁等)。

AQS基本上是通过可变状态和等待队列实现的。CAS先修改状态,失败后放入等待队列,通过locksupport挂起线程。

当锁所有者释放锁时,它将通过locksupport唤醒等待队列中的后续节点,并让它们再次尝试获取锁(CAS修改状态)。

掌握AQS的原理对于理解JDK中的许多并发组件非常有帮助。

Java并发线程如何阻塞和唤醒?

下面简要说明以下原因:

锁定是因为操作不是原子的。让我们用操作一来解释它。看下面两个图。

我这个操作需要

看上面的第二个图,你能很清楚地理解这个过程吗?

锁定是为了确保上述三个步骤是原子操作。

回到问题上来,只有一个线程要写,没有竞争,所以不需要锁定。

但是,如果你看第一张图片,因为主内存和本地内存的存在

在一个线程写入后,其他线程无法立即看到它。这就是可见性问题。

添加volatile关键字后,它将在操作后强制工作内存和主内存同步,以确保其他线程可以立即看到它。

java 线程状态 java 线程池 java多线程实例

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。