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)如何处理线程异常. 这本书基本来到了终点,其实在第四章来说,核心(基础)的线程知 ...
随机推荐
- How to set up Dynamics CRM 2011 development environment
Recently I have been starting to learn Microsoft Dynamics CRM 2011 about implement plugin and workfl ...
- 由Python通过__new__实现单例模式,所想到的__new__和__init__方法的区别
之前通过读书,了解到在Python中可以通过__new__方法来实现单例模式,代码一个示例如下,我就有了几个疑问,什么是单例模式?__new__方法是用来做什么的?用__new__方法实现的单例模式, ...
- Java 核心内容相关面试题【3】
目录 面向对象编程(OOP) 常见的Java问题 Java线程 Java集合类 垃圾收集器 异常处理 Java小应用程序(Applet) Swing JDBC 远程方法调用(RMI) Servlet ...
- URL模块之parse方法
url.parse(urlString , boolean , boolean) parse这个方法可以将一个url的字符串解析并返回一个url的对象. 参数: urlString指传入一个url地址 ...
- 使用Python操作excel文件
使用的类库 pip install openpyxl 操作实现 工作簿操作 # coding: utf-8 from openpyxl import Workbook # 创建一个excel工作簿 w ...
- C#表达式目录树(Expression)
1.什么是表达式目录树 :简单的说是一种语法树,或者说是一种数据结构(Expression) 2.用Lambda声明表达式目录树: Expression<Func<; //表达试目录树的方 ...
- .NET自带缓存机制实例
using System;using System.Web;using System.Web.Caching;using System.Collections.Generic;using System ...
- Unity3D游戏xlua轻量级热修复框架
这是什么东西 前阵子刚刚集成xlua到项目,目的只有一个:对线上游戏C#逻辑有Bug的地方执行修复,通过考察了xlua和tolua,最终选择了xlua,原因如下: 1)项目已经到了后期,线上版本迭代了 ...
- 父类清除浮动的原因、(清除浮动代码,置于CSS中方便调用)
浮动因素在静态网页制作中经常被应用到,比如要让块级元素不独占一行,常常应用设置float的方式来实现.但是应用的时候会发现,设置了子类浮动后,未给父类清除浮动,这样就会造成一下问题: 1.浮动的元素会 ...
- 状态压缩dp第一题
标签: ACM 题目: Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; ...