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每个都是 type 的实例restype

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

如果您想将它们用作对象锁,是的,它是有效的。

注意:Java 命名约定建议使用第一个字母作为类名的大写字母。

于 2012-10-10T18:03:56.233 回答
1

你可以在Enums 这里阅读。由于它是一个常量并且只有一个实例,因此您不需要同步。

但是,如果您使用 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最简单的方法是声明它们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 回答