我有一个使用单例模式的程序。我需要使用线程,记住使用线程机械化之前和之后的输出应该是相同的。我的意思是避免出现“损坏模式”的情况,即线程忽略单例并创建更多的单一对象。但是,我失败了。我尝试使用“同步”,但没有任何改变。同样的错误结果。
我的主要与可运行的
public class Main implements Runnable {
Main(){}
public void run ()
{
Counter[] counters = new Counter[5];
for(int i = 0; i < counters.length; i++)
{
counters[i] = Counter.getCounter();
}
for(int i = 0; i < counters.length; i++)
{
counters[i].increment();
System.out.println("counter[" + i + "] = " + counters[i]);
}
for(int i = 0; i < 5; i++) {
counters[i].decrement();
System.out.println("counter[" + i + "] = " + counters[i]);
}}
public static void main(String[] args)
{
Main m1=new Main();
Main m2=new Main();
Main m3=new Main();
new Thread(m1).start();
new Thread(m2).start();
new Thread(m3).start();
}
}
应用单例模式的另一个类
public class Counter {
private static Counter myInstance = null;
public static Counter getCounter()
{
if(myInstance == null)
{
synchronized (Counter.class) {
if(myInstance == null)
{
myInstance = new Counter();
}
}
}
return(myInstance);
}
private int myCounter;
private Counter() {
myCounter = 0;
}
public void increment() {
myCounter++;
}
public void decrement() {
myCounter--;
}
public String toString() {
return(Integer.toString(myCounter));
}
}
最佳答案
不要使用双重检查单例模式,无论它是否损坏,这都不是现代的做法。
Java 中的单例应该使用内部类或枚举来实现(请参阅 Effective Java 第 3 项:使用私有(private)构造函数或枚举类型强制使用单例属性):
a) 内部类单例模式:
public class MySingleton{
private MySingleton(){}
private static class InstanceHolder{
private static final MySingleton INSTANCE = new MySingleton();
}
public static MySingleton getInstance(){
return InstanceHolder.INSTANCE;
}
}
b) 枚举单例模式
public enum MySingleton{
INSTANCE;
public static MySingleton getInstance(){
return INSTANCE;
}
}
关于java编程和java单例多线程问题(单例与多线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5364994/