【发布时间】:2015-02-06 15:22:14
【问题描述】:
枚举非常适合创建单例。我知道枚举方法不是线程安全的,所以我试图使其成为线程安全的。任何人都可以确认此实现是否正确。这么多地方用static和volatile就可以了,能优化吗?由于内部类是私有的,所以我必须在枚举中创建函数来访问内部类功能。可以优化吗?
import java.util.Date;
public enum SingletonWithEnum {
INSTANCE;
private static class Singleton{
private static volatile int count;
private static volatile Date date;
public static int getCount() { return count;}
public static void setCount(int countParam) { synchronized(Singleton.class){ count = countParam; }}
public static Date getDate() { return date;}
public static void setDate(Date dateParam) { synchronized(Singleton.class){ date = dateParam;}}
public static String printObject() {
return "Singleton [count=" + getCount() + ", date=" + getDate() + "]";
}
}
public int getCount() { return Singleton.getCount();}
public void setCount(int countParam) {Singleton.setCount(countParam);}
public Date getDate() { return Singleton.getDate();}
public void setDate(Date dateParam) {Singleton.setDate(dateParam);}
public String toString(){return Singleton.printObject();}
};
我就是这样用的。
SingletonWithEnum object1 = SingletonWithEnum.INSTANCE;
object1.setCount(5);
object1.setDate(new Date());
【问题讨论】:
-
“我知道枚举方法不是线程安全的” - 好吧,前提是你使它们不安全。枚举通常是无状态的,此时它们是完全线程安全的。
-
在这里使用枚举对我来说似乎很奇怪。它们是用来列举一些东西的,所以这是在滥用它。
-
@IngoBürk 使用带有单个实例的枚举作为单例是一种非常常见的模式。事实上,枚举在 JVM 中只创建一次,因此非常适合表示单例。有关该主题的更多信息,请参阅 Josh Bloch 的“Effective Java”。
-
@IngoBürk 对于枚举单例,请参阅stackoverflow.com/questions/70689/…
-
@JonSkeet 基于此stackoverflow.com/questions/2531873/… 我认为枚举方法不是线程安全的。我错过了什么?哇,乔恩你在升c方面也很出色。我一直想成为多种语言的专家,但行业趋势总是推动坚持使用一种语言。你是怎么做到的?
标签: java multithreading enums thread-safety singleton