Rap*_*oth 4 java singleton enums multithreading
我对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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,每个线程将其名称写入枚举的属性"message"中,然后将其打印到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
Run Code Online (Sandbox Code Playgroud)
我期望的是我得到每个循环计数器(0-9)一条消息.但是在这个例子中我有多个由Thread#3写的消息,那怎么可能呢?有竞争条件吗?
如果我的代码是废话:我如何正确测试我的单例以获得线程安全?
单例不是线程安全的 - 你没有做任何事情来保证message变量的可见性.
你可以做到这volatile一点.但请注意,输出可能是许多不同的东西-特别是你不一定会得到一个Message written by Thread #i每个i.
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |