gpt4 book ai didi

java - 当线程调用 wait 时,它会释放锁而不是竞争条件

转载 作者:行者123 更新时间:2023-12-01 23:25:47 26 4
gpt4 key购买 nike

根据源码中同步方法的基本定义 - link

“当一个线程正在执行对象的同步方法时,调用同一对象的同步方法的所有其他线程都会阻塞(挂起执行),直到第一个线程完成该对象。”

我读到了关于wait()的内容,它在 sleep 之前释放了一个锁。这里存在一个困惑,如果wait释放,那么其他线程可以进入同步方法并执行这是有道理的,因为它可能会导致竞争条件?

这是我的示例代码,它允许一个两个线程进入同步块(synchronized block)。

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author Ashish Pancholi
*/
public class Test {

public Test() {
Sharing sharing = new Sharing();
Worker worker_ = new Worker(sharing);
Thread thread_ = new Thread(worker_, "one");
Worker worker = new Worker(sharing);
Thread thread = new Thread(worker, "two");
thread_.start();
thread.start();
}

public static void main(String[] argu) {
Test test = new Test();
}

public class Worker implements Runnable {

private Sharing sharing;

public Worker(Sharing sharing) {
this.sharing = sharing;
}

@Override
public void run() {
sharing.check();
}
}

public class Sharing {

public void check() {
synchronized (this) {
System.out.println("Thread IN " + Thread.currentThread().getName());
try {
wait(5000);
} catch (InterruptedException ex) {
}
System.out.println("Thread OUT " + Thread.currentThread().getName());
}
}
}
}

输出-

Thread IN one
Thread IN two
Thread OUT one
Thread OUT two

最佳答案

是的,这是有道理的。

wait() 方法的 API 表示:

Causes the current thread to wait until either another thread invokes the notify() method or the notifyAll() method for this object, or a specified amount of time has elapsed.

因此,如果 wait 方法释放监视器对象上的锁,则没有其他线程可以获得它,因此没有其他线程可以调用 notify该监视器对象上的notifyAll

wait(5000) 表示当前线程将等待最多 5000 毫秒的通知,然后再继续或在 5000 毫秒后继续。如果您想保持锁定并暂停 5000 毫秒,则必须使用 Thread.sleep(5000)。

关于java - 当线程调用 wait 时,它会释放锁而不是竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20030155/

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