2012-10-10 68 views
0

,我讀了1.5,我們可以使用枚舉爲單同步上枚舉監測

public enum Singleton { 

    INSTANCE; 

    //Singleton method 
    public void someMethod() {...} 
} 

Singleton.INSTANCE.someMethod(); 

這是否意味着在枚舉類型的每個條目是一個實例本身? 如果我使用類定義枚舉類型,我可以在枚舉類型的每個條目上使用塊同步嗎?

class smokers extends Thread{ 

    public enum restype{ 
     TOBACCO,MATCH,PAPER 
    } 

    public void run(){ 
     if(xxxx){ 

     synchronized(restype.PAPER){ 
        .... 
      } 
     } 
     else 
     { 
      synchronized(restype.MATCH){ 
        .... 
      } 

     } 
    } 

這個有效的代碼是?

回答

1

TOBACCO,MATCH,PAPER每個都是restype類型的實例。

你不能修改枚舉常量,所以不需要同步。

如果您想將它們用作對象鎖,那麼它是有效的。

注意:Java命名慣例建議使用第一個字母作爲類名的大寫字母。

0

代碼看起來有效,但如果你需要做的是,把邏輯的枚舉

public enum RestType{ 
    PAPER{ 
     public synchronized void foo(){ return true }; 
    }, 
    MATCH{ 
     public void foo(){ return false }; 
    }; 

    public abstract boolean foo(); //I've never see an abstract method define a 
            //synchronized method... so I have not 
            //idea if it's valid 
} 
+0

然後,他應該stil同步該方法,例如:'PAPER {0} {0} {} }' – Chirlo

1

你可以閱讀有關Enumshere。 由於它是一個常量,並且只有一個實例,所以不需要同步。

但是,如果您使用setter更改成員的值,則需要添加同步。現在

public enum Restype { 
    TOBACCO(1), MATCH(2), PAPER(3); 

    private int value = 0;//I have purposefully not declare it as final 

    private Restype(int value) { 
     this.setValue(value); 
    } 

    public void setValue(int value) {// now I can change value in multiple 
             // threads. 
     this.value = value; 
    } 

    public int getValue() { 
     return value; 
    } 
} 

我會以各種途徑實現setValuegetValue同步最簡單的將是聲明它們​​。

但上面顯然是濫用枚舉。

在java中,你可以在任何對象上擁有syncrhonized塊,所以你也可以在枚舉實例上同步塊。

synchronized (Restype.TOBACCO) { 
     // Allowed not recommenced 
     //every class should define its own mutex 
    } 
+0

即使它是一個單例,如果它用於這個「吸菸者」類,仍然需要同步,因爲可能有多個同時運行的「吸菸者」實例 – Chirlo

+0

@Chirlo我已經添加了代碼片段來詳細說明更多。我希望它消除疑慮。如果枚舉成員沒有被聲明爲「final」,那麼它是需要的 –