【发布时间】:2015-12-03 14:43:34
【问题描述】:
我对 Java 中的多线程比较陌生。因为我需要一个线程安全的单例(我实现为枚举),所以我编写了一个小的测试代码,它会产生一个奇怪的输出。
代码:
public enum EnumSingleton {
INSTANCE;
/** state variables */
private String message;
/** Constructor */
private EnumSingleton() {
}
/** add well-known accessor for the instance (is NOT necessary) */
public static EnumSingleton getInstance() {
return INSTANCE;
}
/** Accessors */
public String getMessage() {
return message;
}
public void setMessage(String name) {
this.message = name;
}
}
public class App {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
final int b = i;
Thread thread = new Thread("Thread #" + b) {
@Override
public void run() {
EnumSingleton singleton = EnumSingleton.getInstance();
singleton.setMessage("Message written by "+this.getName());
System.out.println("Current thread "+this.getName() + ": "+singleton.getMessage());
}
};
thread.start();
}
}
}
因此,每个线程都将其名称写入枚举的属性“消息”中,然后将其打印到 STDOUT。我得到以下我觉得奇怪的输出:
Current thread Thread #6: Message written by Thread #3
Current thread Thread #1: Message written by Thread #1
Current thread Thread #8: Message written by Thread #8
Current thread Thread #5: Message written by Thread #1
Current thread Thread #4: Message written by Thread #4
Current thread Thread #9: Message written by Thread #9
Current thread Thread #7: Message written by Thread #3
Current thread Thread #2: Message written by Thread #3
Current thread Thread #0: Message written by Thread #3
Current thread Thread #3: Message written by Thread #3
我所期望的是,我会为每个循环计数器 (0-9) 收到一条消息。但是在这个例子中,我有多个线程 #3 写的消息,那怎么可能呢?有竞争条件吗?
如果我的代码很垃圾:如何正确测试我的单例的线程安全性?
【问题讨论】:
-
枚举已经是单例了,你还需要什么?
-
@Stultuske :线程安全和可测试性,但首先,我想了解“它”
标签: java multithreading enums singleton