gpt4 book ai didi

Java 同步在退出时自动通知?这是预期的吗?

转载 作者:搜寻专家 更新时间:2023-11-01 01:35:26 24 4
gpt4 key购买 nike

Java 问题:

自动退出同步块(synchronized block)执行 notifyAll()。这是预期的行为吗?

我测试了一下,好像1. 当执行从同步块(synchronized block)中出来时,它会自动 notifyAll()2. 当方法本身被同步时,它在返回时自动执行 notify()。(不是 notifyAll() )

代码:



公共(public)类测试{

public static void main(String[] args) 抛出 InterruptedException {

MyThread lock = new MyThread();

new WatingThread(lock,1).start();
new WatingThread(lock,2).start();

//以上两个线程将启动然后等待锁


锁.开始();

}
}

类 MyThread 扩展线程 {

公共(public)无效运行(){

尝试 {
线程. sleep (2000);
} catch (InterruptedException e){
e.printStackTrace();
}

System.out.println("MyThread 正在尝试获取锁..");
同步(这){
System.out.println("MyThread 已经获得了锁!!");

System.out.println("MyThread 正在退出同步块(synchronized block)..");
}
System.out.println("MyThread 已经释放了锁!!");

}
}


类 WatingThread 扩展线程
{
私有(private)对象锁;
私有(private) int id;

public WatingThread(对象锁,int id)
{
this.lock = 锁;
这个.id = id;
}

@覆盖
公共(public)无效运行(){
System.out.println(String.format("[%d] : 检查锁是否可用...",new Object[]{id}));
同步(锁定){
System.out.println(String.format("[%d] : 获得了锁!!",new Object[]{id}));
尝试 {
System.out.println(String.format("[%d] : 将要等待锁定.. ",new Object[]{id}));
锁.等待();
System.out.println(String.format("[%d] : 得到通知!!!",new Object[]{id}));
} catch (InterruptedException e){
e.printStackTrace();
}

System.out.println(String.format("[%d] :我完成了!!",new Object[]{id}));
}
}


}

输出:

[2] : 检查锁是否可用 ...
[2] : 获得锁!!
[1] : 检查锁是否可用...
[2] : 等待锁..
[1] : 获得锁!!
[1] : 等待锁定..
MyThread 正在尝试获取锁..
MyThread 已获取锁!
MyThread 即将退出同步块(synchronized block)..
MyThread 已释放锁!
[1] : 收到通知!!!
[1]:我完成了!!
[2] : 收到通知!!!
[2]:我完成了!!

最佳答案

您发现的是 java.lang.Thread 在内部使用等待设施,将自身用作锁。这记录在 Thread.join() 的描述中方法(可能不是最好的地方):

This implementation uses a loop of this.wait calls conditioned on this.isAlive. As a thread terminates the this.notifyAll method is invoked. It is recommended that applications not use wait, notify, or notifyAll on Thread instances.

顺便说一下,如果您使用 while 循环来检查等待条件是否按照最佳实践的要求发生了变化,那将防止您被唤醒,当然,最好只使用 对象无论如何都是一把锁。

关于Java 同步在退出时自动通知?这是预期的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16955006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com