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

立即加载(又称饿汉模式):在使用类的时候已经将对象创建完毕,常见实现方法是直接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. To Use Genymotion

    Chinese Site:http://www.genymotion.cn/ Offical Site:http://www.genymotion.com/  Not available in Chi ...

  2. ExtJS学习------Ext.define的继承extend,用javascript实现相似Ext的继承

    (1)Ext.define的继承extend 详细实例: Ext.onReady(function(){ //Sup Class 父类 Ext.define('Person',{ config:{ n ...

  3. unity, Awake的调用时机

    Awake是在setActive(true)时才会被调用,不过如果再setActive(false)然后重新setActive(true)的话,Awake就不会再被调用了,也就是说Awake能保证仅被 ...

  4. 已安装 SQL Server 2005 Express 工具。若要继续,请删除 SQL Server 2005 Express 工具

    数据库安装sql server2008R2时遇到. 安装sql server 2008 management,提示错误:Sql2005SsmsExpressFacet 检查是否安装了 SQL Serv ...

  5. 热烈祝贺阿尔法Go首战告捷

    这是人类的一大杰作和进步.一个国家和民族的未来在科技,靠造房子是成不了科技强国的. 当然,也要祝贺一下北上深房价突破历史高位.这也是伟大而不朽的成果.

  6. 【待完善】make: command not found,以及libtool.m4 and ltmain.sh have a version mismatch问题的解决方案

    之前为了使用一个库,都是去下载源码,然后根据开发者提供的README手动用GCC编译,一直不能使用Makefile感觉很蛋痛,比如最近使用的ZThread 还是怪自己以前过于依赖IDE 最近发现用Cy ...

  7. Oracle面试题目及解答

    这里的回答并不是十分全面,这些问题可以通过多个角度来进行解释,也许你不必在面试过程中给出完全详尽的答案,只需要通过你的解答使面试考官了解你对ORACLE概念的熟悉程度. 1. 解释冷备份和热备份的不同 ...

  8. 如何将自己的网站分享到QQ空间,微信,微博等等。

    逛一些网站的时候经常会看到右侧挂个分享栏,让用户把自己的站分享到qq空间,微信等等,所以自己也研究了下,把他加到了自己的网站上,喜欢的可以先看看效果:去转盘网,不多说了,直接上代码: window._ ...

  9. c++11线程池实现

    咳咳.c++11 增加了线程库,从此告别了标准库不支持并发的历史. 然而 c++ 对于多线程的支持还是比較低级,略微高级一点的使用方法都须要自己去实现,譬如线程池.信号量等. 线程池(thread p ...

  10. dva学习---effects异步中通过select获取当前的state

    根据 在组件中dispatch一个action的例子中,如果要在effects中对于param数据和当前的state数据进行再出处理,这里怎么获取state呢?采用select,如下:       e ...