2010-11-18 89 views
3

假設我有一個Singleton類之間(任何類可以獲取實例):Java併發:共享內存線程

class data 
{ 
     Color sun = "WHITE"; 
     String luminance = "HIGH"; 
     int age = 25; 
     double speed = 52.5 
     ... 
} 

假設我有幾個線程得到這一類的Singleton實例的引用。我試圖找出一種方法來同步基於PER FIELD的獲取/設置。

如果我對每個變量都有一個同步的getter/setter方法,那麼在設置該方法之前,這將基本上「鎖定」整個類(而不是單個字段)。

有沒有辦法讓這些線程只鎖定實例值而不是鎖定整個類?

- 編輯:我很抱歉的巨大的一個對象數據。

數據實際上存儲在幾個類中。每個對象最多隻有20-25個成員。

+3

我覺得我的頭會爆炸。你不只是減少可變性?例如。 *刪除*鎖定巨大的單片icky對象的需要。 – 2010-11-18 22:49:01

+4

我的臉已經融化了,想着這個。 – MattC 2010-11-18 22:51:29

+1

如果您共享一把鎖,您是否確定有性能瓶頸?請注意,您可以在大約2 ms內跨多個線程鎖定對象1000次。基本上,在你使你的應用程序更加強化之前,你是否測量過這個瓶頸或者你在猜測? – 2010-11-18 23:02:36

回答

5

如果非要爲每個變量同步的getter/setter方法,那麼這將基本上直到該方法被設置爲「鎖定」整個類(而不是單獨的場)。

那麼,沒有。它會鎖定整個對象,但是這可能是反正你是什麼意思?

數據有1000+變量...

選項1

如果你有足夠的內存,你可以簡單地有一個Object[] locks = new Object[1000];爲你獲取鎖。

public void setColor(Color newCol) { 
    synchronized (locks[17]) { 
     sun = newCol; 
    } 
} 

選項2

另一個選項可以是標記的所有字段爲volatile。這至少會確保讀取和寫入是以原子方式執行的。

選項3

看一看AtomicLongAtomicReferenceAtomicBoolean,...等等在java.util.concurrent.atomic package

+0

揮發性是我一直在尋找的。謝謝! – 2010-11-19 14:44:26