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

标签 java multithreading singleton

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

我的主要与可运行的

    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/

相关文章:

python - 为什么 Borg 模式比 Python 中的 Singleton 模式更好

java - IcedTea 1.8 版无法打开任何 JNLP 文件

java - 我们是否应该将递归调用堆栈视为辅助空间?

java - 使用 GWT 更改 RichtextToolbar.java

java - 我可以锁定 ImageView 的位置吗?

c# 事件执行是线程安全的吗?

java - 等待另一个线程中的邮件发送完成

c# - 如何从一个对象启动两个并行线程?

Swift - 如何将单例设置为零

PHP 全局对象