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){
                    ....
            }

        }
    }

これは有効なコードですか?

4

3 に答える 3

1

TOBACCO,MATCH,PAPERそれぞれがタイプのインスタンスですrestype

列挙型定数は変更できないため、同期する必要はありません。

それらをオブジェクトロックとして使用したい場合は、はい、それは有効です。

注:Javaの命名規則では、クラス名の大文字として最初の文字を使用することを推奨しています。

于 2012-10-10T18:03:56.233 に答える
1

あなたはEnums ここについて読むことができます。定数であり、インスタンスが1つしかないため、同期は必要ありません。

ただし、セッターを使用してメンバーの値を変更する場合は、同期を追加する必要があります。

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;
    }
}

これで、同期を実現するためのさまざまな方法がsetValueあり、getValue最も簡単なのはそれらを宣言することsynchronizedです。

しかし、明らかに上記は列挙型の誤用です。

Javaでは、任意のオブジェクトに同期ブロックを設定できるため、列挙型インスタンスにも同期ブロックを設定できます。

synchronized (Restype.TOBACCO) {
        // Allowed not recommenced 
        //every class should define its own mutex
    }
于 2012-10-10T18:09:42.717 に答える
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
}
于 2012-10-10T18:06:40.943 に答える