Shi*_*han 4 java multithreading
我在接受采访时问了这个问题.在我告诉他之前,
一旦线程进入实例上的任何同步方法,任何其他线程都不能在同一实例上输入任何其他同步方法.
考虑一下片段:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
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++);
}
}
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
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.");
}
}
Run Code Online (Sandbox Code Playgroud)
所以,一旦你创建了这个线程,他就会问你new Producer1(q),然后根据你的说法,该synchronized int get()方法必须被同一个线程锁定,即new Producer1(q)访问它时synchronized int put().我说是.
但我检查了eclipse,得到了可以调用new Consumer1(q).该计划完美无缺.
我哪里错了?
O/P:
呼叫wait()将释放监视器等待的时间.
这就是记录的内容 Object.wait():
当前线程必须拥有此对象的监视器.线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒.然后线程等待,直到它可以重新获得监视器的所有权并继续执行.