考虑有两个线程正在等待执行synchronized块。现在有一个机会在这种情况下等待我真的需要调用notify()吗?我认为当同步块执行完成其他线程会释放锁吗? notify()方法的确切用途是什么?
线程专家请解释一下?
答案 0 :(得分:1)
不,在这种情况下你不需要使用notify()
。你是对的,在释放锁之后,必须等待获取锁的线程会自动继续。
notify()
方法与wait()
方法结合使用。当一个线程调用wait()
时,它可以释放锁并开始等待。可以结束等待的条件之一是另一个线程调用notify()
时。必须在当前线程为wait()
的实例上调用notify()
和synchronized
。
wait()
,直到生产者notify()
有更多数据可用。
答案 1 :(得分:0)
当一个线程进入synchronized块并且调用wait时,释放进入synchronized块时获取的锁,并且线程等待其他线程通知它,在这种情况下它将重新获取锁并继续。当线程再次释放时来自同步块。
答案 2 :(得分:0)
来自doc,
唤醒正在此对象监视器上等待的单个线程。如果 任何线程都在等待这个对象,其中一个被选中 惊醒。选择是任意的,由酌情决定 实现。线程通过调用一个线程在对象的监视器上等待 等待方法。
所以如果一个对象正在等待调用wait
方法。那么你可以使用notify唤醒它们。
答案 3 :(得分:0)
<强>描述强>
java.lang.Object.notify()唤醒正在等待的单个线程 在这个对象的监视器上。如果任何线程正在等待此对象, 其中一个被选中被唤醒。选择是任意的 由实施决定。一个线程等待 通过调用其中一个等待方法来监视对象的监视器。
有关更多信息,请参阅以下链接。
我希望它会对你有所帮助。
答案 4 :(得分:0)
就像你使用多线程一样,方法是同步的,这意味着它将在所有线程之间共享,但任何线程将在执行另一个线程后使用它。 如果任何线程发生任何更改,那么通过使用下面的通知方法可以看到所有的代码就是这样的例子:
class Detail {
public String name = "", sername = "";
Scanner sc;
public synchronized String getData() {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return name+""+sername;
}
public synchronized void show() {
try {
name = "hello";
sername = "hii";
Thread.sleep(1000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
notify();
}
}
class Data1 extends Thread {
Detail detail;
public Data1(Detail detail1)
{
// super("1");
this.detail = detail1;
start();
}
public void run()
{
System.out.println("name is :"+detail.getData());
}
}
class Data2 extends Thread {
Detail detail2;
public Data2(Detail detail1)
{
//super("2");
this.detail2 = detail1;
start();
}
public void run()
{
detail2.show();
}
}
public class SyncDemo {
public static void main(String ar[])
{
Detail det = new Detail();
Data1 d1= new Data1(det);
Data2 d2= new Data2(det);
}
}