这个问题是在我的面试中问到的。在我回答之前,
一旦一个线程进入实例上的任何同步方法,其他线程就不能进入该实例上的任何其他同步方法。
考虑下面的代码片段:
Q1:
public class Q1 {
int n;
boolean valueSet = false;
synchronized int get() {
while (!valueSet)
try {
wait();
} catch (InterruptedException e) {
System.out.println("InterruptedException caught");
}
System.out.println("Got: " + n);
valueSet = false;
notify();
return n;
}
synchronized void put(int n) {
while (valueSet)
try {
wait();
} catch (InterruptedException e) {
System.out.println("InterruptedException caught");
}
this.n = n;
valueSet = true;
System.out.println("Put: " + n);
notify();
}
}
制作人1:
public class Producer1 implements Runnable {
Q1 q;
Producer1(Q1 q) {
this.q = q;
new Thread(this, "Producer").start();
}
@Override
public void run() {
int i = 0;
while (true) {
q.put(i++);
}
}
}
Consumer1
public class Consumer1 implements Runnable {
Q1 q;
Consumer1(Q1 q) {
this.q = q;
new Thread(this, "Consumer").start();
}
@Override
public void run() {
while (true) {
q.get();
}
}
}
PC1:
public class PC1 {
public static void main(String args[]) {
Q1 q = new Q1();
new Producer1(q);
new Consumer1(q);
System.out.println("Press Control-C to stop.");
}
}
因此,他问道,一旦您创建了此线程 new Producer1(q)
,那么根据您的说法,当它访问synchronized int put()
时,synchronized int get()
方法必须由相同的线程即new Producer1(q)
锁定。我回答说是的。
但是我在eclipse中检查发现,new Consumer1(q)
可以调用get。程序运行良好。
我错在哪里了?
输出:
wait()
函数是做什么用的? - chrylis -cautiouslyoptimistic-wait()
正在等待……另一个线程被通知。 - Bahramdun Adilwait
。 - David Schwartz