![](/img/trans.png)
[英]IllegalMonitorException using Semaphore and Monitor in Java
[英]Monitor (semaphore) in java
我一直在閱讀和閱讀Herbert Schildt撰寫的“ The Complete Reference”一書中的Java實用程序。
在本書的“線程”一章中,有一個“線程間通信”部分。
一本側面書說,在當前線程終止之前,任何線程都不會執行實例的其他同步方法,但請看下面的程序。
在輸出中,它執行兩個同步方法,那么有人怎么能解釋正在發生的事情呢?
輸出:
放:0
放置:1
把:2
把:3
把:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
得到:4
class Main{
public static void main(String args[]){
Q q=new Q();
Producer p=new Producer(q);
Consumer c=new Consumer(q);
}
}
class Q {
int n;
synchronized int get(){
System.out.println("get :"+n);
return n;
}
synchronized void put(int n){
this.n=n;
System.out.println("put :"+n);
}
}
class Producer implements Runnable{
Q q;
Producer(Q q){
this.q=q;
new Thread(this,"Producer").start();
}
public void run(){
int i=0;
while(true){
q.put(i++);
}
}
}
class Consumer implements Runnable{
Q q;
Consumer(Q q){
this.q=q;
new Thread(this,"Consumer").start();
}
public void run(){
while(true){
q.get();
}
}
}
從Java文檔中提取,
同一對象上的兩個同步方法調用不可能交錯。 當一個線程正在為對象執行同步方法時,所有其他為同一對象塊調用同步方法的線程(掛起執行),直到第一個線程對該對象完成
因此,終止並不意味着線程本身( 例如: Consumer
不等到Producer
死亡或完成,反之亦然) ,而是所有同步方法/塊的執行完成。
為了回答您的問題,仍然可以使用Q
運行Producer
和Consumer
,但是get
和put
方法都將不會同時執行,因為與對象實例的隱式同步(使用關鍵字synchronized
。
Producer
或Consumer
在任何給定時間都只會執行一種方法,即,當Consumer
調用get
時, Producer
將無法調用put
,反之亦然。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.