文档章节

单例模式和线程安全

lee123lee
 lee123lee
发布于 2013/08/21 00:08
字数 546
阅读 279
收藏 1
点赞 0
评论 0
//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
博文 136
码字总数 122159
作品 1
闵行
高级程序员
设计模式梳理(一)

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

lxq_xsyu ⋅ 2017/11/02 ⋅ 0

[设计模式]单例模式

简介 单例模式(Singleton Pattern)保证一个类只有一个实例,并提供一个访问它的全局访问点。 单例模式是一种对象创建型模式 (可参考 设计模式 创建型模式)。 单例模式是设计模式中最简单的...

文艺小青年 ⋅ 2017/11/16 ⋅ 0

系统架构技能之设计模式-单件模式

一、开篇 其实我本来不是打算把系统架构中的一些设计模式单独抽出来讲解的,因为很多的好朋友也比较关注这方面的内容,所以我想通过我理解及平时项目中应用到的一 些常见的设计模式,拿出来给...

wbf961127 ⋅ 2017/11/12 ⋅ 0

代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho ⋅ 04/09 ⋅ 0

springMVC 默认单例 那些变量是线程安全的

springMVC负责的controller层的类默认是单例模式的,单例模式少去了重复创建对象,垃圾内存回收的过程,在性能方面有一些提升。 但是,http请求往往是同时多个请求进来的,这样就会开启多个线...

wsadzxcleg ⋅ 04/22 ⋅ 0

创建型模式.单例模式-懒汉、饿汉、枚举、原子

1 安全发布对象的四种方法 在多线程中,为了保证线程安全性,我们要正确地发布对象,保证发布地对象不要逸出。 在静态初始化函数中初始化一个对象引用 将对象的引用保存到volatile类型域或者...

阿杜杜不是阿木木 ⋅ 03/28 ⋅ 0

JavaScript设计模式之观察者模式

前言 准备研究一下MVVM的一些东西,由于MVVM运用了观察者模式的思想,因此翻开了《JavaScript设计模式与开发实践》一书,将观察者模式学习了一遍,顺便有对一些常用的设计模式进行一些了解,...

Srtian ⋅ 05/22 ⋅ 0

JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云 ⋅ 05/18 ⋅ 0

1、单例模式

定义: 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。 特点: 1、单例类只...

晚天吹凉风 ⋅ 02/22 ⋅ 0

设计模式.策略模式

策略模式跟抽象工厂非常相似,基本逻辑是根据需要实例化出需要用的类。不同的是策略模式需要调用者非常清晰的知道有哪些策略,各个策略的调用规则,而抽象工厂的话,需要知道有哪些类,找到调...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 24分钟前 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 44分钟前 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 57分钟前 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部