文档章节

单例模式和线程安全

lee123lee
 lee123lee
发布于 2013/08/21 00:08
字数 546
阅读 279
收藏 1
//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;
        }

    }

© 著作权归作者所有

共有 人打赏支持
lee123lee
粉丝 51
博文 144
码字总数 122159
作品 1
闵行
高级程序员
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
设计模式:单例模式的写法(基础写法和线程安全写法)

单例模式的写法很多,先给出一种最基础的写法: (A种写法): A写法是单例模式最简单、最基础、最清晰的写法,但遗憾的是这种写法是线程不安全的代码写法。假设该类同时在并发N多个线程中被...

开开心心过
2015/07/17
0
0
Objective-C中单例模式的实现

单例模式在Cocoa和Cocoa Touch中非常常见。比如这两个,[UIApplication sharedApplication]和[NSApplication sharedApplication],大家应该都见过。但是我们应该如何在代码中实现一个单例模式...

雾灵峰
2013/03/24
0
0
我的Java设计模式-单例模式

  就算不懂设计模式的兄弟姐妹们,想必也听说过单例模式,并且在项目中也会用上。但是,真正理解和熟悉单例模式的人有几个呢?接下来我们一起来学习设计模式中最简单的模式之一——单例模式...

Jet啟思
2017/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Oracle return exit continue

常在循环体中看到下面3种语句: return exit continue 举例说明 啥都没有 -- none begin for i in 1 .. 10 loop if i < 5 then dbms_output.put_line('i < 5, i = ' || to_char......

taadis
今天
3
0
JSONObject 转换时出错 InvocationTargetException

JSONObject 转换时出错java.lang.reflect.InvocationTargetException 一时看不出来是什么问题。 挺奇怪的。 百度参考了一下这个 网页的解决方案 说是类型不对,空? 仔细查看代码,果然是有一...

之渊
今天
3
0
no such module 'pop'问题

在github上 clone 了一个 swift 项目,编译时提示"no such module 'POP'"错误,查了一下居然是因为podfile中指定的最低版本是iOS 11.0,大于我测试手机的iOS版本10.3.3,将Podfile中的最低版...

yoyoso
今天
3
0
redis 系列一 -- 简介及安装

1.简介 redis -- remote dictionary server 远程字典服务 使用 C 语言编写; 高性能的 key-value数据库; 内存数据库,支持数据持久化。 Redis 是一个开源(BSD许可)的,内存中的数据结构存...

imbiao
今天
4
0
nginx log记录请求响应时间

有时为了方便分析接口性能等,需要记录请求的时长,通过修改nginx的日志格式可以做到,如 添加一个新的log_format log_format timed_combined '$remote_addr - $remote_user [$time_local] "...

swingcoder
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部