zoukankan      html  css  js  c++  java
  • java集群优化——多线程下的单例模式

            在最初学习设计模式时,我为绝佳的设计思想激动不已,在以后的project中。多次融合设计模式,而在当下的设计中。我们已经觉察出了当初设计模式的高瞻远瞩。可是也有一些不足,须要我们去改进。有人说过。世界上没有绝对的事,当然,再简单的事情,环境变了,也会发生变化,今天和大家一起分享在多线程下单例模式的优化。

    1,传统

    首先,我们回想下传统的单例(懒汉式)是怎样工作的:

    public class SingletonClass{
        private static SingletonClass instance=null;
        public static SingletonClass getInstance()
        {
            if(instance==null)
            {
                   instance=new SingletonClass();
            }
            return instance;
        }
        private SingletonClass(){
        }
    }


    我们不难看出,在多线程执行时,普通的代码会带了困恼,大家看多线程代码执行时的图片:



    2,双重锁

    我们看到线程1和线程2都运行了代码,我们得到的并非一个单例的对象,而是多个对象。针对这些我们进行了同步的优化。


    public static class Singleton{
        private static Singleton instance=null;
        private Singleton(){
            //do something
        }
        public static Singleton getInstance(){
            if(instance==null){
                synchronized(Singleton.class){
                    if(null==instance){
                        instance=new Singleton();
                    }
                }
            }
            return instance;
        }
    }

    我们在看看这样的代码的多线程执行图:


    大家看,只执行了一次。不不过它被同步机制保护了,并且是进行了双重判定。这样保证多线程下单例模式的正常执行。

    3,枚举

    在jdk1.5之后。java注意到这一细节,在创建单例应用时,我们能够利用枚举类型完毕我们的工作,而且他是线程安全的。

    源代码:

    public enum SingletonEnum
    {
        INSTANCE;
        private String name;
        publicString getName()
        {
           returnname;
        }
         publicvoid setName(String name)
        {
           this.name = name;
        }
     }
    
    

        这样的优化,使我们更优雅地适用代码。可是也带来了一定的问题,就是我们对对象的类型有了模糊的概念,所以在工作中,还是建议保留双锁模式,对一些工具类则能够採取枚举类型优化,简化我们的代码与逻辑。


    总结:

            细节的优化。就像雕琢一件艺术品,我们接触的高人越多。这种思想就越浓厚,所以,我们经常推断一个人事怎么的品格与素养,通过他接触的人。朋友就能够猜測出来,而计算机内。也是如此,我们接触的优秀框架多了。自己自然就是优秀的设计师。







  • 相关阅读:
    软件设计中的分层模式, 三层开发遵循的原则,分层开发的特点和优势
    什么是jsp?
    在Servlet中如何如何获取请求的参数?
    Servlet的加载(执行过程,原理)和生命周期
    servlet的注册
    什么是servlet容器
    什么是Servlet
    如何访问动态页面——URL
    什么是C/S? Client/server的简写,这里Server指的是DBServer。
    MVC(Model-View-Controller)软件设计模式
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6875638.html
Copyright © 2011-2022 走看看