大家好,又见面了,我是你们的朋友全栈君。
参考链接:
http://www.mianshigee.com/topic/1022grf/
1、懒汉式单例、线程不安全
public class Singleton {
private static Singleton uniqueInstance;
// 构造方法
private Singleton(){
};
// 实例方法
public static Singleton getInstance(){
if (uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
注意:
代码简单明了,使用了懒加载模式,但存在致命的问题。
当有多个线程并行调用 getInstance() 的时候,就会创建多个实例。
也就是说在多线程下不能正常工作。
2、懒汉式单例、线程安全
public class Singleton1 {
private static Singleton1 uniquesingle;
private Singleton1(){
}
// 使用synchronized将实例方法设为同步的
public static synchronized Singleton1 getInstance(){
if (uniquesingle == null){
uniquesingle = new Singleton1();
}
return uniquesingle;
}
}
注意:
为了解决线程安全的问题,最简单的方法是将整个 getInstance() 方法设为同步(synchronized)
虽然做到了线程安全,并且解决了多实例的问题,但是它并不高效。
因为在任何时候只能有一个线程调用 getInstance() 方法。
而且 同步操作 只需要在第一次调用时才被需要,即第一次创建单例实例对象时。
所以,这就引出了双重检验锁。
3、饿汉式、线程安全、静态final变量
public class Singleton2 {
private static final Singleton2 uniquesingle = new Singleton2();
private Singleton2(){
}
public static Singleton2 getInstance(){
return uniquesingle;
}
}
注意:
这种方法非常简单,因为单例的实例被声明成 static 和 final 变量了,
在第一次加载类到内存中时就会初始化,所以创建实例本身是线程安全的。
单例会在加载类后一开始就被初始化,即使客户端没有调用 getInstance()方法。
饿汉式的创建方式在一些场景中将无法使用:譬如 Singleton 实例的创建是依赖参数或者配置文件的,
在 getInstance() 之前必须调用某个方法设置参数给它,那样这种单例写法就无法使用了。
4、双重检验加锁、线程安全
public class Singleton3 {
//private static Singleton3 uniquesingle; // 这里是原始的
private volatile static Singleton3 uniquesingle; // 这里是改进的
private Singleton3(){
}
public static Singleton3 getInstance(){
if (uniquesingle == null){
synchronized (Singleton3.class){
if (uniquesingle == null){
uniquesingle = new Singleton3();
}
}
}
return uniquesingle;
}
}
注意:
5、静态内部类单例、线程安全
public class Singleton4 {
// 静态内部类
private static class SingletonHolder{
private static final Singleton4 uniqueInstance = new Singleton4();
}
private Singleton4(){
}
public static final Singleton4 getInstance(){
return SingletonHolder.uniqueInstance;
}
}
注意:
6、枚举单例、线程安全
public enum Singleton5 {
INSTANCE;
}
注意:
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/156983.html原文链接:https://javaforall.cn