java单例模式的三种实现(线程安全)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java单例模式的三种实现(线程安全)相关的知识,希望对你有一定的参考价值。
直接上代码(代码注释比较完整):
第一种:
package pattern.singleton.doublecheck;
public class Singleton {
// 私有化默认构造方法,防止外部生成此实例
private Singleton(){}
// 声明此单一实例
// volatile: 能够及时通知其他线程,更新其线程缓存数据
private volatile static Singleton INSTANCE;
// 向外提供此单一实例
public static Singleton getInstance(){
// 如果INSTANCE为空,准备去上锁及实例化赋值
// 如果不为空,那么直接去返回实例,防止了要再次上锁的性能问题
if(INSTANCE == null) {
// 上锁 因为是静态方法,需要上类锁
synchronized(Singleton.class) {
// 再次判断INSTANCE是否为空,因为可能上一个线程已经实例化并赋值过了
if(INSTANCE == null) {
// 实例化并赋值
INSTANCE = new Singleton();
}
}
}
// 返回实例
return INSTANCE;
}
// what ever field(s)...
// what ever method(s)...
}
第二种:
package pattern.singleton.innerclass;
public class Singleton {
// 私有化默认构造方法,防止外部生成此实例
private Singleton(){}
// 声明私有静态内部类,包含外部类的静态不可变实例
private static class innerClass{
private static final Singleton INSTANCE = new Singleton();
}
// 向外提供此单一实例
public static Singleton getInstance() {
return innerClass.INSTANCE;
}
// what ever field(s)...
// what ever method(s)...
}
第三种:
package pattern.singleton.enume;
public enum Singleton {
// 因为一个enum成员相当于一个实例对象,直接通过Singleton.INSTANCE来获取
INSTANCE;
// what ever field(s)...
// what ever method(s)...
}
以上是关于java单例模式的三种实现(线程安全)的主要内容,如果未能解决你的问题,请参考以下文章
java 单例 线程安全 写一个测试类 说明下面单例不是线程安全的
JAVA笔记(19)--- 线程概述;如何实现多线程并发;线程生命周期;Thread常用方法;终止线程的三种方式;线程安全问题;synchronized 实现同步线程模型;