这个问题是在一次采访中被问到的。在我告诉他之前,
考虑片段:
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();
}
}
Producer1:
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++);
}
}
}
消费者 1
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 get()
方法一定是被同一个线程锁定的,即在访问 new Producer1(q)
时被 synchronized int put()
锁定。我说是。但是我检查了 eclipse,get 可以通过
new Consumer1(q)
调用。该程序运行完美。我哪里错了?
O/P:
最佳答案
对 wait()
的调用将释放等待时间的监视器。
这就是 Object.wait():
记录的内容
关于java - 一个对象的 2 个同步方法是否有可能同时被 2 个线程访问?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35627773/