gpt4 book ai didi

java - wait(n) 每次我改变同步关键字的位置时都会表现不同

转载 作者:行者123 更新时间:2023-11-29 08:08:25 25 4
gpt4 key购买 nike

引用下面的代码

     public void acquire(){
synchronized(a){
print("acquire()");
try{
//Thread.sleep(5000);
synchronized(this){
wait(5000);
}
print("I have awoken");
print("" + a);
}catch(Exception e){
e.printStackTrace();
}
}
print("Leaving acquire()");
}


public void modify(int n){
print("Entered in modfy");
synchronized(a){
try{
//Thread.sleep(5000);
synchronized(this){
wait(5000);
}
this.a=n;
print("new value" + a);
}catch(Exception e){
e.printStackTrace();
}
}
}

        final SynchoTest ttObj = new SynchoTest();
Thread A = new Thread(new Runnable(){
public void run() {
ttObj.acquire();
}
},"A");

Thread B = new Thread(new Runnable(){
public void run() {
ttObj.modify(97);
}
},"B");
A.start();
B.start();

据我所知,wait(n) 会暂停一个线程,直到调用 notify()/notifyAll() 或指定的时间 n 结束。

但是……

  • 在上述方法中,如果我像使用 Thread.sleep(n) 一样直接使用 wait(n),我得到运行时异常。
  • 如果我同步这两个方法而不是围绕 wait(n)同步块(synchronized block)然后我没有得到任何异常但两者线程永远被阻塞。
  • 但是如果我喜欢我附上 ie wait(n) 围绕着 synchronized block ,它工作正常。

请告诉我为什么?还要告诉我,如果我使用 sleep(n) 而不是 wait(n),为什么它在定位同步块(synchronized block)时没有表现不同?

我的问题是关于 wait(n) 在同步关键字的不同位置上的各种结果。

@格雷

notify() or notifyAll(), and wait() must be in a synchronized block for the object you are waiting on

通过将同步块(synchronized block)放置在不同的位置来解释我为什么会遇到运行时异常。

现在请解释一下,为什么

public void method(){
synchronized(a){
synchronized(this){
wait(n);
}
}
}

工作正常。但是

public synchronized void method(){
synchronized(a){
wait(n);
}
}

永远阻塞我的线程。

最佳答案

wait(n)sleep(n) 是完全不同的暂停代码执行的方法:

wait(n)Object 实例上调用,将暂停执行直到 notify()/notifyAll() 方法在该实例上被调用或直到计时器(参数)到期。

sleep(n)Thread 对象上调用,就该线程而言,它基本上停止了世界。

您的问题归结为:

  • 您是否希望您的对象充当互斥锁,等待另一段代码完成,然后再继续它自己的操作?然后在其他代码中使用 wait(n) 和相应的 notify()/notifyAll()

  • 你想在给定的时间范围内停止整个线程的执行吗?然后使用Thread.sleep(n)

关于java - wait(n) 每次我改变同步关键字的位置时都会表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9571982/

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