• 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;
        }
     }
    
    

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


    总结:

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







  • 相关阅读:
    马赛克算法及iOS代码实现
    iOS制作Static Library(静态库),实现多工程的连编
    iOS由ImageIO.framework实现gif的系统解码
    KVC和KVO实现监听容器类(数组等)的变化
    Dynamicaly Typed(动态定型), Objective-C Runtime Programming
    Mac OSX下修改hosts文件
    MAC配置SVN服务器
    Encoding非常用编码转换
    Block作为参数使用
    UITextField关闭系统自动联想和首字母大写功能
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6875638.html
Copyright © 2020-2023  润新知