java多线程编程核心技术——第六章总结
目录
- 1.0立即加载/“饿汉式”
- 2.0延迟加载/“懒汉式”
- 3.0使用静态内置类实现单例模式
- 4.0序列化与反序列化的单例模式实现
- 5.0使用static代码块实现单例模式
- 6.0使用enum枚举数据类型实现单例模式
- 7.0完善使用enum枚举实现单例模式
1.0立即加载/“饿汉式”
立即加载:实用类的时候已经将对象创建完毕,常见的实现方法就是直接new实例化。
注:是在调用方法前,就已经实例化了(通常是在类一加载的时候就已经实例化了)。
public class Singleton {
//立即加载方法==饿汉式
private static Singleton singleton = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
//此代码版本为立即加载
//此代码版本缺点:是不能有其他实例变量
//因为getInstance()方法没有同步
//所以可能出现非线程安全问题
return singleton;
}
}
2.0延迟加载/“懒汉式”
延迟加载:在调用get()方法时实例才被创建,常见的实现办法就是在get()中进行实例化。
注:在调用获取实例的方法时,实例才被创建。
public class Singleton {
private static Singleton singleton;
private Singleton(){}
public static Singleton getInstance() {
//延迟加载,若多个线程在此if失去执行权,最终会产生很多实例对象
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
可以使用synchronized方法或者synchronized同步代码块解决多线程中的同步问题,但是效率较低。
书中提供了双检查锁机制:
可以使用DCL双检查锁机制实现单例:
public class Singleton {
private volatile static Singleton singleton;
private Singleton(){}
//使用双检查锁机制来解决问题,既保证了不需要使用同步代码块的异步执行性,又保证了单例效果。
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
注:关于双检索的争议还是有很多的,但是目前可以认为其实安全的。
双检查锁的安全性问题总结(未完成)
3.0使用静态内置类实现单例模式
public class Singleton {
//内部类形式
private static class MyHanlder {
private static Singleton singleton = new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return MyHanlder.singleton;
}
}
4.0序列化与反序列化的单例模式实现
虽然静态内置类可以达到线程安全,但如果遇到序列化对象,使用默认的方式运行得到的还是多例。
public class Singleton implements Serializable{
private static final long seroalVersionUID = 888L;
//内部类形式
private static class MyHanlder {
private static Singleton singleton = new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return MyHanlder.singleton;
}
protected Object readResolve() throws ObjectStreamException {
return MyHanlder.singleton;
}
}
书写readResolve()方法就可以避免在序列化与反序列化的过程中单例失效。
注:目前为什么这样还不理解。
5.0使用static代码块实现单例模式
静态代码块中的代码在使用类的时候就已经执行了,所以可以应用静态代码块的这个特性来实现单例设计模式。
public class Singleton implements Serializable{
private static Singleton singleton = null;
private Singleton() {}
static {
singleton = new Singleton();
}
public static Singleton getInstance() {
return singleton;
}
}
6.0使用enum枚举数据类型实现单例模式
枚举与静态代码块类似,在使用枚举时,构造方法会被自动调用,也可以使用其这个特性实现单例设计模式。
本文内容是书中内容兼具自己的个人看法所成。可能在个人看法上会有诸多问题(毕竟知识量有限,导致认知也有限),如果读者觉得有问题请大胆提出,我们可以相互交流、相互学习,欢迎你们的到来,心成意足,等待您的评价。
java多线程编程核心技术——第六章总结的更多相关文章
- Java多线程编程核心技术-第1章-Java多线程技能-读书笔记
第 1 章 Java 多线程技能 本章主要内容 线程的启动 如何使线程暂停 如何使线程停止 线程的优先级 线程安全相关的问题 1.1 进程和多线程的概念及线程的优点 进程是操作系统结构的基础:是一次程 ...
- Java多线程编程核心技术-第4章-Lock的使用-读书笔记
第 4 章 Lock 的使用 本章主要内容 ReentrantLocal 类的使用. ReentrantReadWriteLock 类的使用. 4.1 使用 ReentrantLock 类 在 Jav ...
- java多线程编程核心技术——第三章
第一节等待/通知机制 1.1不使用等待/通知机制实现线程间的通讯 1.2什么是等待/通知机制 1.3等待/通知机制的实现 1.4方法wait()锁释放与notify()锁不释放 1.5当interru ...
- java多线程编程核心技术——第三章总结
第一节等待/通知机制 1.1不使用等待/通知机制实现线程间的通讯 1.2什么是等待/通知机制 1.3等待/通知机制的实现 1.4方法wait()锁释放与notify()锁不释放 1.5当interru ...
- Java多线程编程核心技术-第7章-拾遗增补-读书笔记
第 7 章 拾遗增补 本章主要内容 线程组的使用. 如何切换线程状态. SimpleDataFormat 类与多线程的解决办法. 如何处理线程的异常. 7.1 线程的状态 线程对象在不同的运行时期有不 ...
- Java多线程编程核心技术-第5章-定时器 Timer-读书笔记
第 5 章 定时器 Timer 定时 / 计划功能在移动开发领域使用较多,比如 Android 技术.定时计划任务功能在 Java 中主要使用的就是 Timer 对象,他在内部使用多线程的方式进行处理 ...
- Java多线程编程核心技术-第3章-线程间通信-读书笔记
第 3 章 线程间通信 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大 ...
- Java多线程编程核心技术-第2章-对象及变量的并发访问-读书笔记
第 2 章 对象及变量的并发访问 本章主要内容 synchronized 对象监视器为 Object 时的使用. synchronized 对象监视器为 Class 时的使用. 非线程安全是如何出现的 ...
- java多线程编程核心技术——第七章补漏拾遗
本章主要知识点: 1)线程组的使用 2)如何切换线程状态 3)SimpleDateFormat类与多线程的解决方法 4)如何处理线程异常. 这本书基本来到了终点,其实在第四章来说,核心(基础)的线程知 ...
随机推荐
- Nginx服务及编译安装
第1章 Nginx 1.1 nginx的概念 Nginx("engine x")是一个开源的.支持高性能.高并发的WWW服务和代理服务软件,具有高开发(特别是静态资源),占用系统资 ...
- 前后端分手大师——MVVM 模式
之前对 MVVM 模式一直只是模模糊糊的认识,正所谓没有实践就没有发言权,通过这两年对 Vue 框架的深入学习和项目实践,终于可以装B了有了拨开云雾见月明的感觉. 简而言之 Model–View–Vi ...
- ImageMagick图片服务器
1.前置准备工具如下: nodejs express(nodejs mvc框架) body-parser(express middleware) gm(nodejs中用来处理图片的) uuid(nod ...
- 《Metasploit魔鬼训练营》虚拟环境搭建中网络配置的一些问题
直接使用网上下载与书本配套的虚拟机环境,发现NAT服务器10.10.10.254(192.168.10.254)虽然可以和其他虚拟机ping通,但是连不上网.自然windows xp靶机也连不上网了. ...
- 项目详解4—haproxy 详解
一.企业服务架构图及负载均衡的要求 1.场景说明 在企业生产环境中,每天会有很多的需求变更,比如增加服务器.新业务上线.url路由修改.域名配置等等,对于前端负载均衡设备来说,容易维护,复杂度低,是首 ...
- unity中Ray、RaycastHit 、Raycast(小白之路)
1.Ray Ray(Vector3 origin, Vector3 direction) Ray:在程序中可以理解为射线,就是以某个位置(origin)朝某个方向(direction)的一条射线,是一 ...
- HDU1171--01背包
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- 手动安装lump
教你编译PHP7 (nginx+mysql+php7) PHP7正式版已经发布,性能是PHP5.6的两倍! 操作系统: CentOS Linux, 6.5 64位服务器: 阿里云空的操作系统,我们从 ...
- vue.js初学,笔记1,安装
最近学习vue.js,下面是笔记: 说明:因为npm安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果npm的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事.来自官网:"这 ...
- TensorFlow MNIST(手写识别 softmax)实例运行
TensorFlow MNIST(手写识别 softmax)实例运行 首先要有编译环境,并且已经正确的编译安装,关于环境配置参考:http://www.cnblogs.com/dyufei/p/802 ...