首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

单例模式 跟 线程安全

2013-09-04 
单例模式 和 线程安全// 1.单例分两种://饿汉式和 懒汉式// 饿汉式:package com.chess.test/**** 饿汉模

单例模式 和 线程安全

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

热点排行