2016 - 2024

感恩一路有你

java线程原理分析 Java并发线程如何阻塞和唤醒?

浏览量:1556 时间:2023-04-06 22:10:38 作者:采采

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

每个对象都有两个方法wait和notify,以及同步。

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

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

2.这里暂时跳过了notify/wait、yeild等基本机制,一般的实现原理是基于对象的同步队列非常类似于后面的AQS。

3.并发组件的基本AQS侧重于AQS(AbstractQueuedSynchronizer)。

因为这是jdk外包的基础(比如Lock、BlockingQueue、CountdownLatch等。).

Aqs基本上是通过一个易变的变量状态和一个等待队列来实现的。在抢锁时,CAS先修改状态,失败后放入等待队列,通过LockSupport挂起线程。

当锁的拥有者释放锁时,它会通过LockSupport唤醒等待队列的后续节点,让它再次尝试抢锁(CAS修改状态),以此类推。

掌握AQS的原理对理解jdk中的很多并发组件很有帮助。

()方法:以毫秒为单位,使线程处于阻塞状态,时间到了自动唤醒。

()和resume()方法:挂起和唤醒线程,suspend e()使线程进入阻塞状态,只有调用对应的resume e()时,线程才会进入可执行状态。不建议这样做,容易出现死锁。

3.yield()方法:调用yield()的效果相当于调度器认为线程已经执行了足够的时间,可以切换到另一个线程。

让 下面我们就来谈谈这三种。可以去csdn看看,了解一下其他的。

java的线程安全是什么?谁能一言以蔽之?

这真的可以 不要用一句话来概括。我写了一篇关于线程安全的长文,我提炼了下面这段话,基本够理解了:

单线程不会有安全问题,多线程编程会有安全问题。根本问题在于是否存在关键资源竞争资源。如果多线程不会访问竞争资源,就不会有安全问题,否则会处理。

什么是竞争资源,如下所示:

如果它们访问它们上下文的资源,比如kafka消费分区工作线程访问它们各自的存储,它们将不会互相干扰;

如果在一个要执行的方法中只使用局部变量,它们不会互相干扰,因为它们位于各自的线程堆栈中;

如果执行的方法使用传入的变量,即所谓的形参变量,取决于传入的变量是否是对象。如果它只是一个普通的参数,它不 没关系。如果是对象,要看对象是不是同一个引用,不同的引用没有关系。

如果在一个执行的方法中使用了相同的引用,不管它是传入的还是外部的全局变量,比如log4 的伐木工,唐 不要担心,因为log4已经完成了线程安全的编写。

如果在执行的方法中使用了相同的引用:

I)但只是读而不写,读与读之间没有,也不 没关系。

Ii)有所有的写,但是写不依赖于读,也就是说,线程可以直接写到覆盖,而不需要获得 "最新 "数据,这种情况无关紧要;

Iii)两者都是写的,写的时候要看最新的资料,所以需要处理;

线程 方法 对象 状态 队列

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