2015-06-11 97 views
1

比方說,我有這個類:併發從只讀域讀取和寫入的讀/寫域共享對象

public SharedObject { 
    private int readOnlyField; 
    private int readWriteField; 

    public SharedObject(int field1, int field2) { 
    this.readOnlyField = field1; 
    this.readWriteField = field2; 
    } 

    public getField1() {...} 

    public synchronized getField2() {...} 

    public synchronized setField2(...) {...} 
} 

我可以有同時使用這3種方法多線程?

很顯然,我可以用最後2種同步的方法,但我不知道如果getField1()可以與其他2

我認爲答案是肯定的同時執行,但只是要確定是否我錯過了一些微妙之處。

+1

當然可以。如果沒有幫助,請查看http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReadWriteLock.html#readLock(),稍後我會發布更詳盡的答案 –

回答

1

對於getField1則其可以同時通過2個線程沒有任何等待和同步執行同時執行。而且由於你沒有任何setter,並且它的值在對象實例化時被初始化,所以也沒有改變髒讀。

對於getField2setField2,沒有2個線程並且同時對SharedObject的同一個實例執行這些方法。

希望這有助於!

+0

實際上,getField2和setField2不能同時被2個線程執行。這是synchronized關鍵字的定義。不,但第二次閱讀也許我不明白你的最後一句話。你能詳細說明一下嗎?這種情況不應該是可能的,因爲2個相同的實例必須具有相同的鎖。他們是一樣的。 – Kami

+0

當沒有同步時,Object的鎖不再需要執行,但是接下來是同步,那麼線程將獲得該對象/實例的鎖,這意味着如果任何其他線程想要獲取相同的對象鎖,那麼它必須等待。現在,可能發生2個線程想要鎖,如果有不同的優先級,那麼具有更高優先級的線程將首先獲得鎖,如果相同的優先級首先出現或基於JVM。如果對象不一樣,那麼這一切都不會進入畫面,因爲它全部關於同一對象的鎖定。 – hagrawal

+0

是的,我的陳述變得混亂。我編輯過。謝謝。 – hagrawal

1

是的。其他線程可以執行一個不是的功能,標記爲同步

所以,你的情況:

沒有兩個線程可以同時執行getField2setField2。但是getField1()可以與任一getField2setField2