线程安全的单例模式的几种实现方法分享
线程安全的单例模式的几种实现方法分享
发布时间:2016-12-28 来源:查字典编辑
摘要:1、饿汉式单例复制代码代码如下:publicclassSingleton{privatefinalstaticSingletonINSTAN...

1、饿汉式单例

复制代码 代码如下:

public class Singleton {

private final static Singleton INSTANCE = new Singleton();

private Singleton() { }

public static Singleton getInstance() {

return INSTANCE;

}

}

2、借助内部类

属于懒汉式单例,因为Java机制规定,内部类SingletonHolder只有在getInstance()方法第一次调用的时候才会被加载(实现了lazy),而且其加载过程是线程安全的。内部类加载的时候实例化一次instance。

复制代码 代码如下:

public class Singleton {

private Singleton() { }

private static class SingletonHolder {

private final static Singleton INSTANCE = new Singleton();

}

public static Singleton getInstance() {

return SingletonHolder.INSTANCE;

}

}

3、普通加锁解决

复制代码 代码如下:

public class Singleton {

private static Singleton instance = null;

private Singleton() { }

public static synchronized Singleton getInstance() {

if(instance == null) {

instance = new Singleton();

}

return instance;

}

}

虽然解决了线程安全问题,但是每个线程调用getInstance都要加锁,我们想要只在第一次调用getInstance时加锁,请看下面的双重检测方案

4、双重检测,但要注意写法

复制代码 代码如下:

public class Singleton {

private static Singleton instance = null;

private Singleton() { }

public static Singleton getInstance() {

if(instance == null) {

synchronzied(Singleton.class) {

Singleton temp = instance;

if(temp == null) {

temp = new Singleton();

instance = temp

}

}

}

return instance;

}

}

由于指令重排序问题,所以不可以直接写成下面这样:

public class Singleton {

private static Singleton instance = null;

private Singleton() { }

public static Singleton getInstance() {

if(instance == null) {

synchronzied(Singleton.class) {

if(instance == null) {

instance = new Singleton();

}

}

}

return instance;

}

}

但是如果instance实例变量用volatile修饰就可以了,volatile修饰的话就可以确保instance = new Singleton();对应的指令不会重排序,如下的单例代码也是线程安全的:

public class Singleton {

private static volatile Singleton instance = null;

private Singleton() { }

public static Singleton getInstance() {

if(instance == null) {

synchronzied(Singleton.class) {

if(instance == null) {

instance = new Singleton();

}

}

}

return instance;

}

}

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新Java学习
热门Java学习
编程开发子分类