博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单例模式和线程安全
阅读量:6693 次
发布时间:2019-06-25

本文共 4756 字,大约阅读时间需要 15 分钟。

  hot3.png

//1.单例分两种:      //    饿汉式  和 懒汉式      // 饿汉式:      package com.chess.test;              /**       *        * 饿汉模式的单例       * @author chess       *       */        public final class SignleObjectHungry        {                    private static  SignleObjectHungry signleObjHun = new SignleObjectHungry();                        private SignleObjectHungry()            {                            }                        public static SignleObjectHungry getInstance()            {                return signleObjHun;            }                    }              // 懒汉式        package com.chess.test;                /**       * 懒汉式单例模式       * @author chess       *       */        public final class SingleObjectLazy         {                    private static SingleObjectLazy signleObjLazy = null;                        private SingleObjectLazy()            {                            }                        public static SingleObjectLazy getInstance()            {                if(null == signleObjLazy)                {                    signleObjLazy = new SingleObjectLazy();                }                return signleObjLazy;            }                    }      //  由于单例存在线程安全问题,所以要解决的话    //  对于    // 饿汉式线程安全        package com.chess.test;                /**       * 饿汉式单例线程安全       * @author chess       *       */        public final class SingleObjectHungryAndThreadSafe         {                    private static SingleObjectHungryAndThreadSafe signleObj = new SingleObjectHungryAndThreadSafe();                                    private SingleObjectHungryAndThreadSafe()           {                          }                      /**          * 加同步锁方法实现线程安全          *           * 此方法存在 性能开销 大          *           * @return          */           public synchronized static SingleObjectHungryAndThreadSafe getInstance()           {               return signleObj;           }                               }        //懒汉式线程安全        package com.chess.test;                /**       * 懒汉式单例 和 线程安全       *        * @author chess       *        */        public final class SingleObjectLazyAndThreadSafe         {                        private static SingleObjectLazyAndThreadSafe singleObj = null;                    private SingleObjectLazyAndThreadSafe()             {                    }                    // public synchronized static SingleObjectLazyAndThreadSafe getInstance()            // {            //  if(null == singleObj)            //  {            //      singleObj = new SingleObjectLazyAndThreadSafe();            //  }            //                  //  return singleObj;            //                  // }                    // 细化粒度,提高性能 提高线程并发度            //双重检查锁机制            public static SingleObjectLazyAndThreadSafe getInstance()            {                if (null == singleObj)                {                    synchronized (SingleObjectHungryAndThreadSafe.class)                     {                        if (null == singleObj)                         {                            singleObj = new SingleObjectLazyAndThreadSafe();                        }                    }                }                        return singleObj;                    }                        //至此 线程安全 已经感觉狠完美了。            //多线程中,如果  线程A 执行到第 30 行,此时对象为空,则进入初始化对象,            //      然而初始化对象需要时间,            //   此时 线程B 也执行到第 30 行 , 此时对象已经初始化未完成, 但是地址已经存在。            //   则 线程B 将获取一个未完成的 对象。                    }        //完美的解决方案        package com.chess.test;                        /**       * 单例模式线程安全的完美状态       * 新的设计模式       * 使用内部类   JLS会保证这个类的线程安全       * (完全使用 JAVA 虚拟机的机制进行同步保证,且 没有同步的关键字)       * @author chess       *       */        public class SingleObjectThreadSafeNoSync         {            /**           * 以内部类实现懒加载(懒汉)           *            * 初始化这个内部类的时候  JLS 保证这个类的线程安全           * @author cWX181783           *           */            private static class SingletonHolder            {                public final static SingleObjectThreadSafeNoSync singleObject =                                                  new SingleObjectThreadSafeNoSync();            }                        public static SingleObjectThreadSafeNoSync getInstance()            {                return SingletonHolder.singleObject;            }             /**     * Java正则表达式判断字符串是否包含中文     * @param str 待测字符串     * @return 是否包含中文     */    public static boolean isContainChinese(String str) {        if (null == str || "".equals(str.trim())) {            return false;        }        Pattern p=Pattern.compile("[\u4e00-\u9fa5]");        Matcher m=p.matcher(str);        if(m.find()) {            return true;        }        return false;        }    }

转载于:https://my.oschina.net/exit/blog/155690

你可能感兴趣的文章
windows Socket 通信模型
查看>>
jquery validate案例1
查看>>
Redis应用场景
查看>>
不想工作的一天
查看>>
音效原理
查看>>
dom4j的生成xml并格式化输出
查看>>
Re-negotiation handshake failed: Not accepted b...
查看>>
价值百万的PPT是如何炼成的
查看>>
企业管理过程信息化自助开发平台架构研究与应用
查看>>
TDBadgedCell
查看>>
HMLabel
查看>>
为Redis配置自定义fastJson序列化工具类
查看>>
2015年用户界面工具干货资源精选
查看>>
开源 java CMS - FreeCMS2.3会员我的评论
查看>>
git diff 颜色插件
查看>>
Redis Sentinel 介绍
查看>>
配置SSH连接GitHub
查看>>
phpQuery—基于jQuery的PHP实现
查看>>
Linux下设置环境JDK环境变量
查看>>
Jsoup 输入汇总
查看>>