一、立即加载/"饿汉模式"和延迟加载/"懒汉模式"

立即加载(又称饿汉模式):在使用类的时候已经将对象创建完毕,常见实现方法是直接new实例化

延迟加载(又称懒汉模式):在调用get()方法时实例才被创建,常见实现方法是在get()方法中进行new实例化

二、懒汉模式在多线程下的缺点及解决

缺点:可能会出现多个实例的问题。

解决:

1、声明synchronized关键字:

对get方法加上synchronized关键字即可保证同步运行,但效率太低。

2、尝试同步代码块

这个方法本质和synchronized一样,加锁同步执行,还是效率太低

3、针对某些重要的代码进行单独的同步。

效率提高了,但是没有解决问题,还是会有多个实例。

为什么不同步?因为只是对处理逻辑做了同步,但是进入处理逻辑的判断没有同步处理,还是会有问题的。

4、使用DCL双检查锁机制(大多数通用的机制)

即在第三种方式的基础上,在同步方法内,额外再做一次判断,判断通过执行相应代码,失败不执行。

三、单例模式的其他实现

3.1 使用静态内置类实现单例模式

这个和饿汉模式感觉没区别...不过不同的是:饿汉模式实在类初始化时直接创建,而静态内置类实在静态内部类被调用时实现。只是改变了实现的时间点,本质没什么区别。

静态内置类可以实现线程安全,但是如果遇到序列化对象时,使用默认方式运行得到的结果还是多例的。

3.2 序列化与反序列化的单例模式实现

静态内置类可以实现线程安全,但是如果遇到序列化对象时,使用默认方式运行得到的结果还是多例的。解决方法是:自己定义readResolve方法?

3.3 使用static代码块实现单例模式

这个和饿汉模式感觉没区别..只是一个是static对象,一个是static代码块

3.4使用enum枚举数据类型实现单例模式

枚举enum和静态代码块的特性相似,使用枚举类时,构造方法会被自动调用。

这种方式好像暴露了一些问题,在下一种方式中修复,具体是什么问题,其实我不理解...不理解什么单一原则呀..等

END

《JAVA多线程编程核心技术》 笔记:第六章:单例模式与多线程的更多相关文章

  1. Java多线程编程核心技术,第六章

    1,饿汉模式/单例模式,一开始就新建一个静态变量,后面用getInstance()都是同一个变量 2,懒汉模式/单例模式,在getInstance()才会new一个对象,在第一个有了后不会继续创建 3 ...

  2. 《Java并发编程实战》第六章 任务运行 读书笔记

    一. 在线程中运行任务 无限制创建线程的不足 .线程生命周期的开销很高 .资源消耗 .稳定性 二.Executor框架 Executor基于生产者-消费者模式.提交任务的操作相当于生产者.运行任务的线 ...

  3. java多线程编程核心技术-笔记

    一.第一章 1.自定义线程类中实例变量针对其他线程有共享和不共享之分,自定义线程中的变量,如果是继承自thread类,则每个线程中的示例变量的更改,不影响其他线程2.当多个线程去访问一个局部变量是会产 ...

  4. Java多线程编程核心技术,第五章

    1,Timer timer = new Timer(true)现在是守护进程 2,timer是按照顺的,没有异步 3,timer方法,schedule(TimerTask task, Date fir ...

  5. Java多线程编程核心技术,第四章

    1,ReentrantLock 2,object的wait(),wait(x),notify(),notifyAll(),分别等于Condition的await(),await(x,y),signal ...

  6. Java多线程编程核心技术,第三章

    1,notify的同步块完了,才会运行wait的同步块 2,interrupt()不是静态方法,用在wait的线程上会有InteruptException,锁也会被释放 3,notify()唤醒的线程 ...

  7. java并发编程实战:第六章----任务执行

    任务:通常是一些抽象的且离散的工作单元.大多数并发应用程序都是围绕"任务执行"来构造的,把程序的工作分给多个任务,可以简化程序的组织结构便于维护 一.在线程中执行任务 任务的独立性 ...

  8. java并发编程实战笔记---(第二章)线程安全:正确性

    ThreadA__________     同步 ______________ 异步 ___________     异步 ThreadB__________         ____________ ...

  9. 【java并发编程实战】第六章:线程池

    1.线程池 众所周知创建大量线程时代价是非常大的: - 线程的生命周期开销非常大:创建需要时间,导致延迟处理请求,jvm需要分配空间. - 资源消耗:线程需要占用空间,如果线程数大于可用的处理器数量, ...

  10. 多线程编程学习笔记——异步调用WCF服务

    接上文 多线程编程学习笔记——使用异步IO 接上文 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端 接上文 多线程编程学习笔记——异步操作数据库 本示例描述了如何创建一个WCF服务,并宿主 ...

随机推荐

  1. FreeSWITCH小结:关于export的原理介绍及应用

    FreeSWITCH小结:关于export的原理介绍及应用 Export原理 普通export用法 在dialplan中经常会用到export,如下所示: <action application ...

  2. RSAProtectedConfigurationProvider加密web.config

    上一篇文章介绍了用 DataProtectionConfigurationProvider加密web.config文件的方法,不过他有一个缺陷,加密的文件只有在本机才能解密,如果有多台服务器的话,则需 ...

  3. mybatis-config.xml文件详解

    1. 属性列表 Mybatis的配置文件中包含了影响mybatis行为的设置(settings)和属性(properties)信息.文档的顶层结构如下: ·configuration 根配置 ·pro ...

  4. 221. Add Two Numbers II【medium】

    You have two numbers represented by a linked list, where each node contains a single digit. The digi ...

  5. 李洪强和你一起学习前端之(4)HTML5介绍

    1.1认识HTML5 html的版本: html4 Xhtml1.0 目前: html5是最高的版本 再怎么变化,无非是多了一些标签而已,但是不单单是提供了一些标签 比如: 开发网页游戏 我们可以开发 ...

  6. HTML5与XML的区别

    XHTML 是 XML 风格的 HTML 4.01. HTML5 是HTML的第五大版本,取代 HTML 4.01. XHTML是基于XML发布的HTML规范,旨在规范HTML的格式. 两者提出的目的 ...

  7. DOCTYPE 与浏览器模式分析

    DOCTYPE 的诞生 DOCTYPE,或者称为 Document Type Declaration(文档类型声明,缩写 DTD).通常情况下,DOCTYPE 位于一个 HTML 文档的最前面的位置, ...

  8. 使用Django框架

    1.安装Django 在命令行模式下使用pip工具来安装Django,pip工具的安装方法见此篇 pip install django 2.确认是否安装成功 在Python交互模式下 import d ...

  9. quick-cocos2d-x 创建自定义lua绑定c++类

    内容主要参考 “在quick-cocos2d-x中添加自定义的类给lua使用” ( http://www.codeo4.cn/archives/746) 1. quick-coco2d-x 使用 to ...

  10. c++封装的发邮件类CSendMail

    项目需要做发邮件的功能,在网上找了一下代码,比较出名的SMailer编译不过(把那个Base64的encode拉到MailSender中实现就能过,但我搞不懂原来出错的原因,就不想用),另外找到了一个 ...