手机
当前位置:查字典教程网 >编程开发 >Java >线程安全的单例模式的几种实现方法分享
线程安全的单例模式的几种实现方法分享
摘要: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信号量控制线程打印顺序的示例分享

struts2单个文件上传的两种实现方式

Java多线程的用法详解

在Struts2中如何将父类属性序列化为JSON格式的解决方法

java如何交换这两个变量的值方法介绍

代理模式之Java动态代理实现方法

基于JTable的列宽与内容自适应的实现方法

解析分别用递归与循环的方式求斐波那契数列的实现方法

JAVA实现单例模式的四种方法和一些特点

java中数组的应用及方法

精品推荐
分类导航