文档章节

单例模式和线程安全

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
粉丝 52
博文 144
码字总数 122159
作品 1
闵行
高级程序员
私信 提问
java设计模式-- 单例模式

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

爱学习的逃课君
2014/11/27
0
0
我的Java设计模式-单例模式

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

Jet啟思
2017/10/26
0
0
Java设计模式系列之单例设计模式

Java设计模式系列之单例设计模式 Hello,大家好,距离上次写博客是2018年1月26号,算了下,有8个月没写博客了。这里给大家道个歉,因为我换了工作,现就职在深圳一家公司,换了城市,加上工作...

我又不是架构师
10/08
0
0
设计模式梳理(一)

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

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

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

开开心心过
2015/07/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用 React 和 Vue 创建相同的应用,他们有什么差异?

在工作中应用 Vue 之后,我对它有了相当深刻的理解。 不过,俗话说「外国的月亮比较圆」,我好奇「外国的」 React 是怎么样的。 我阅读了 React 文档并观看了一些教程视频,虽然它们很棒,但...

阿K1225
21分钟前
0
0
如何使用Kubernetes的configmap通过环境变量注入到pod里

在Kubernetes官网里,有这样一篇文章,提到了Kubernetes里的一个最佳实践就是把应用代码同配置信息分开,一种方式就是使用Kubernetes 1.2里引入的configmap概念。 https://kubernetes.io/bl...

JerryWang_SAP
37分钟前
0
0
2天闭门培训|以太坊智能合约从入门到实战(北京)

2天培训 16个课时 探寻技术原理,精通以太坊智能合约开发 以太坊智能合约是现在应用的最广泛的区块链应用开发方式,HiBlock区块链社区针对以太坊智能合约的学习特别推出2天闭门研修班,通过2...

HiBlock
39分钟前
0
0
限定某个目录禁止解析php,限制user_agent,php相关配置

11月20日任务 11.28 限定某个目录禁止解析php 11.29 限制user_agent 11.30/11.31 php相关配置 1.限定某个目录禁止解析php 核心配置文件内容 <Directory /data/wwwroot/www.123.com/upload> p...

hhpuppy
50分钟前
3
0
Spring的好文章

孤傲苍狼 https://www.cnblogs.com/xdp-gacl/p/4249939.html 跟我学spring http://jinnianshilongnian.iteye.com/blog/1413846 SpringIoc 和Spring Aop 代理模式: 静态代理 动态代理 cglib代......

wangwei2134
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部