标签:loading 方式 ble 同步代码块 类装载 实例 构造器 未使用 完成
采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提供一个取得其对象实例的方法(静态方法)。
class Singleton {
private Singleton() { }
private final static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}
这种单例模式可用,可能造成内存浪费。
class Singleton {
private Singleton() { }
private static Singleton instance;
static { // 在静态代码块中,创建单例对象
instance = new Singleton();
}
public static Singleton getInstance() {
return instance;
}
}
这种方式和上面的方式类似,只不过将类实例化的过程放在了静态代码块中,也是在类装载的时候,就执行静态代码块中的代码,初始化类的实例。
这种单例模式可用,但是可能造成内存浪费。
提供一个静态的公有方法,当使用到该方法时,才去创建 instance
class Singleton {
private Singleton() {}
private static Singleton instance;
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
在实际开发中,不要使用这种方式。
提供一个静态的公有方法,加入同步处理的代码,解决线程安全问题。
class Singleton {
private Singleton() {}
private static Singleton instance;
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
在实际开发中,不推荐使用这种方式。
对第四种实现方式的改进,同步产生实例化的代码块。
class Singleton {
private Singleton() {}
private static Singleton instance;
public static Singleton getInstance() {
if(instance == null) {
synchronized (Singleton.class){
instance = new Singleton();
}
}
return instance;
}
}
本意是想对第四种实现方式的改进, 但是这种同步并不能起到线程同步的作用。跟第三种实现方式遇到的情形一致,线程不安全,还是会进入到 if 语句中,会产生多个实例。
在实际开发中,不能使用这种方式。
提供一个静态的公有方法,加入双重检查代码。
class Singleton {
private Singleton() {}
private static volatile Singleton instance; // volatile
public static volatile Singleton getInstance() {
if(instance == null) {
synchronized (Singleton.class){
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
在实际开发中,推荐使用这种方式。
写一个静态内部类,该类中有一个静态属性 Singleton,提供一个静态的公有方法,直接返回 SingletonInstance.INSTANCE。
class Singleton {
private static volatile Singleton instance;
private Singleton() {}
Singleton private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static synchronized Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
推荐使用。
public class SingletonTest08 {
public static void main(String[] args) {
Singleton instance = Singleton.INSTANCE;
}
}
enum Singleton {
INSTANCE; //属性
public void sayOK() {
System.out.println("ok~");
}
}
借助 JDK1.5 中添加的枚举来实现单例模式,不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。
推荐使用。
标签:loading 方式 ble 同步代码块 类装载 实例 构造器 未使用 完成
原文地址:https://www.cnblogs.com/Songzw/p/13052560.html