gpt4 book ai didi

java编程和java单例多线程问题(单例与多线程)

转载 作者:行者123 更新时间:2023-12-01 06:41:33 24 4
gpt4 key购买 nike

我有一个使用单例模式的程序。我需要使用线程,记住使用线程机械化之前和之后的输出应该是相同的。我的意思是避免出现“损坏模式”的情况,即线程忽略单例并创建更多的单一对象。但是,我失败了。我尝试使用“同步”,但没有任何改变。同样的错误结果。

我的主要与可运行的

    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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com