zoukankan      html  css  js  c++  java
  • 线程安全的两种单例模式

    两种常见的单例模式

    静态内部类单例模式

    /*
     *  静态内部类单例模式
     */
    public class Singleton {
        private Singleton() {
        }
    
        private static final class SingletonHolder {
            private static final Singleton INSTANCE = new Singleton();
        }
    
        public static Singleton getInstance() {
            return SingletonHolder.INSTANCE;
        }
    
        public static void main(String[] args) {
            Thread t1 = new Thread(new Runnable() {
    
                @Override
                public void run() {
                    System.out.println(Singleton.getInstance().hashCode());
                }
    
            }, "t1");
    
            Thread t2 = new Thread(new Runnable() {
    
                @Override
                public void run() {
                    System.out.println(Singleton.getInstance().hashCode());
                }
    
            }, "t2");
    
            Thread t3 = new Thread(new Runnable() {
    
                @Override
                public void run() {
                    System.out.println(Singleton.getInstance().hashCode());
                }
    
            }, "t3");
    
            t1.start();
            t2.start();
            t3.start();
        }
    }
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class InnerSingleton {
        private InnerSingleton() {
        }
    
        private static final class InnerSingletonHandle {
            private static final InnerSingleton INSTANCE = new InnerSingleton();
        }
    
        public static InnerSingleton getInstance() {
            return InnerSingletonHandle.INSTANCE;
        }
    
        public static void main(String[] args) {
            int num = 10;
            ExecutorService executorService = Executors.newCachedThreadPool();
    
            for (int i = 0; i < num; i++) {
                executorService.execute(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println(Thread.currentThread().getName() + ":	" + InnerSingleton.getInstance().hashCode());
                    }
                });
            }
            executorService.shutdown();
        }
    }
    

    运行结果

    ``` pool-1-thread-1: 991873903 pool-1-thread-2: 991873903 pool-1-thread-3: 991873903 pool-1-thread-4: 991873903 pool-1-thread-6: 991873903 pool-1-thread-7: 991873903 pool-1-thread-8: 991873903 pool-1-thread-10: 991873903 pool-1-thread-5: 991873903 pool-1-thread-9: 991873903

    Process finished with exit code 0

    </div>
    
    ### 双重校验单例模式
    ```java
    /*
     * 双重校验单例模式
     */
    public class Singleton {
        private static volatile Singleton instance;
    
        private Singleton() {
        }
    
        public static Singleton getInstance() {
            if (instance == null) {
                synchronized (Singleton.class) {
                    if (instance == null) {
                        instance = new Singleton();
                    }
                    // instance = new Singleton();
                }
            }
            return instance;
        }
    
        public static void main(String[] args) {
            Thread t1 = new Thread(new Runnable() {
    
                @Override
                public void run() {
                    System.out.println(Singleton.getInstance().hashCode());
                }
    
            }, "t1");
    
            Thread t2 = new Thread(new Runnable() {
    
                @Override
                public void run() {
                    System.out.println(Singleton.getInstance().hashCode());
                }
    
            }, "t2");
    
            Thread t3 = new Thread(new Runnable() {
    
                @Override
                public void run() {
                    System.out.println(Singleton.getInstance().hashCode());
                }
    
            }, "t3");
    
            t1.start();
            t2.start();
            t3.start();
        }
    }
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class DoubleCheckSingleton {
        private DoubleCheckSingleton() {
        }
    
        private static volatile DoubleCheckSingleton INSTANCE;
    
        public static DoubleCheckSingleton getInstance() {
            if (INSTANCE == null) {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (DoubleCheckSingleton.class) {
                    if (INSTANCE == null) {
                        INSTANCE = new DoubleCheckSingleton();
                    }
                    // INSTANCE = new DoubleCheckSingleton();
                }
            }
            return INSTANCE;
        }
    
        public static void main(String[] args) {
            int num = 10;
            ExecutorService executorService = Executors.newCachedThreadPool();
    
            for (int i = 0; i < num; i++) {
                executorService.execute(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println(Thread.currentThread().getName() + ":	" + DoubleCheckSingleton.getInstance().hashCode());
                    }
                });
            }
            executorService.shutdown();
        }
    }
    

    运行结果

    ``` pool-1-thread-1: 405652733 pool-1-thread-4: 405652733 pool-1-thread-7: 405652733 pool-1-thread-2: 405652733 pool-1-thread-6: 405652733 pool-1-thread-5: 405652733 pool-1-thread-3: 405652733 pool-1-thread-8: 405652733 pool-1-thread-9: 405652733 pool-1-thread-10: 405652733

    Process finished with exit code 0

    </div>
    
    ### 最后总结
    ![](https://img2018.cnblogs.com/blog/1306719/201811/1306719-20181107155022590-664214116.png)
    ![](https://img2018.cnblogs.com/blog/1306719/201811/1306719-20181107155028084-1715481635.png)
  • 相关阅读:
    C++ STL介绍——String类
    C++ STL介绍——简介
    使用anaconda安装tensorflow (windows10环境)
    JAVA面向对象编程课程设计——项目部署
    JAVA面向对象编程课程设计——web版斗地主
    JAVA面向对象编程课程设计——网络版单机斗地主
    在ASP.NET MVC中使用Web API和EntityFramework构建应用程序
    记一次类型设计的求索历程
    设计模式之策略模式在地铁票价系统中的应用
    C#中的var和dynamic
  • 原文地址:https://www.cnblogs.com/hgnulb/p/9397974.html
Copyright © 2011-2022 走看看