簡體   English   中英

用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運行ProducerConsumer ,但是getput方法都將不會同時執行,因為與對象實例的隱式同步(使用關鍵字synchronized

ProducerConsumer在任何給定時間都只會執行一種方法,即,當Consumer調用get時, Producer將無法調用put ,反之亦然。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM