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

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

    1 spring基本理念是简化java开发. 使用以下4个策略简化java开发 1) 基于POJO的轻量级和最小侵入性编程 2)通过使用DI和AOP实现松耦合 3)基于切面和惯例进行声明式编程 4)通 ...

  2. c++ abs与fabs

    在stdlib.h中定义的abs只针对整数取决对值,如果要对浮点数取绝对值,应该用fabs(或fabsf). 而math.h中定义的abs是可以对浮点数取绝对值的. 所以如果包含了stdlib.h和m ...

  3. Javascript实现真实字符串剩余字数提示

    //文本框剩余字数提示(字符大小) function textLimitCheckSj(thisArea, maxLength, SpanId) { var str = thisArea.value; ...

  4. Centos下运行定时任务Crontab命令介绍

    1.Cron的启动与关闭 因为Cron是Linux的内置服务.能够用下面的方法启动.关闭这个服务: /sbin/service crond start           //启动服务 /sbin/s ...

  5. Unity3D碰撞器事件测试(Rigidbody/Kinematic/Trigger/Collider)

    1.Kinematic和刚体之间的碰撞事件 Unity官方有一个详细的碰撞关系表:http://docs.unity3d.com/Manual/CollidersOverview.html 但其实可以 ...

  6. 小马哥课堂-统计学-t分布(2)

    t分布,随着自由度的增加,而逐渐接近于正态分布 #!/usr/bin/env python3 #-*- coding:utf-8 -*- ############################### ...

  7. 转-subl配置全栈开发环境

    为 Sublime Text 3 设置 Python 的全栈开发环境 Sublime Text 3 (ST3) 是一个轻量级的跨平台文字编辑器,尤以其轻快的速度,易用性和强大的社区支持而著称.它一经面 ...

  8. PyCharm Python迁移项目

    把整个项目文件迁移过去后,执行文件会报不能执行XX,系统找不到指定的文件. 此时把当前的这个文件名字改一下,再运行,修改提示的错误.等错误全部修改,可以正常运行后,再把文件名改回去

  9. tail 命令详解

    tail 指令 功能:从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不 ...

  10. Java动态代理原理及其简单应用

    概念 代理对象和被代理对象一般实现相同的接口,调用者与代理对象进行交互.代理的存在对于调用者来说是透明的,调用者看到的只是接口.代理对象则可以封装一些内部的处理逻辑,如访问控制.远程通信.日志.缓存等 ...