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)如何处理线程异常. 这本书基本来到了终点,其实在第四章来说,核心(基础)的线程知 ...
随机推荐
- Spring+Spring MVC+MyBatis框架集成
目录 一.新建一个基于Maven的Web项目 二.创建数据库与表 三.添加依赖包 四.新建POJO实体层 五.新建MyBatis SQL映射层 六.JUnit测试数据访问 七.完成Spring整合My ...
- java中“==”号的运用
对于值类型,“==”号会判断其是否相等 对于引用类型,“==”对于引用类型则会判断引用(内存地址)是否相同,“==”运算只是调用了对象的equal()方法 public static void mai ...
- php中向前台js中传送一个二维数组
在php中向前台js中传送一个二维数组,并在前台js接收获取其中值的全过程方法: (1),方法说明:现在后台将数组发送到前台 echo json_encode($result); 然后再在js页面中的 ...
- KMP - LeetCode #459 Repeated Substring Pattern
复习一下KMP算法 KMP的主要思想是利用字符串自身的前缀后缀的对称性,来构建next数组,从而实现用接近O(N)的时间复杂度完成字符串的匹配 对于一个字符串str,next[j] = k 表示满足s ...
- 截断上传 CTF
题目:上传绕过 介绍:http://teamxlc.sinaapp.com/web5/21232f297a57a5a743894a0e4a801fc3/index.html 1,我们打开链接,是个上传 ...
- 照虎画猫写自己的Spring——依赖注入
前言 上篇<照虎画猫写自己的Spring>从无到有讲述并实现了下面几点 声明配置文件,用于声明需要加载使用的类 加载配置文件,读取配置文件 解析配置文件,需要将配置文件中声明的标签转换为F ...
- SpringMVC 快速入门
SpringMVC 快速入门 SpringMVC 简介 SpringMVC是 Spring为展示层提供的基于Web MVC设计模式的请求驱动类型的轻量级Web框架,它的功能和Struts2一样.但比S ...
- [NOIP]玩具装箱
题目:(非常经典的模拟赛题,适合动规入门的OIer) 简要分析: 动态规划,用一维数组 f[i] 表示从位置1 到 位置i 的最优花费 ,由于 f[i ] 以前的最优花费都是确定的,故只需要在 1 ...
- 《java.util.concurrent 包源码阅读》04 ConcurrentMap
Java集合框架中的Map类型的数据结构是非线程安全,在多线程环境中使用时需要手动进行线程同步.因此在java.util.concurrent包中提供了一个线程安全版本的Map类型数据结构:Concu ...
- 关于springboot启动的问题.
IDE使用的是IDEA: 遇到的问题:使用springboot自带main方法无法启动示例,解决方案: 如果大家使用Application中的main方法无法正常启动时,可以去修改Project St ...