1.JAVA 中的单列模式
1.1 饿汉模式
public class SingletonDemo {
private static SingletonDemo instance = new SingletonDemo();
private SingletonDemo(){
}
public static SingletonDemo getInstance(){
return instance;
}
}
1.2 懒汉模式
private static Myclass instance;
private Myclass(){
}
public static Myclass getInstance(){
if(instance==null){
instance = new Myclass();
}
return instance;
}
1.3 单列模式
public class SingleDemo {
public static SingleDemo singleDemo;
private SingleDemo(){
}
public static SingleDemo getInstance(){
if(singleDemo == null){
singleDemo = new SingleDemo();
}
return singleDemo;
}
}
1.3.1 线程安全单列模式
public class Singleton {
private volatile static Singleton singleton;
private Singleton(){
}
public static Singleton getSingleton(){
if (singleton == null){
synchronized (Singleton.class){
if (singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
1.3.2 静态内部类单列模式
public class StaticSingleDemo {
private static StaticSingleDemo getInstance(){
return Inner.instance;
}
private static class Inner{
private static final StaticSingleDemo instance = new StaticSingleDemo();
}
}
1.4 双重锁
大部分情况下,同步代码块都不会执行到,提高了程序的性能。
有一种情况,两个线程ThreadA,ThreadB,如果threadA执行到了第一个if条件判断,instance = null;ThreadB也执行到了if条件判断instance = null,所以A和B会依次执行同步代码块里的代码。为了避免创建两个实例,因此又在同步代码块里添加了if条件进行二重检验。
————————————————
public class Singleton {
private static Singleton instance = null;
private Singleton() { }
public static Singleton getInstance() {
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
(2)volatile是一个特殊的修饰符,只有成员变量才能使用它。在Java并发程序缺少同步类的情况下,多线程对成员变量的操作对其他线程是透明的。volatile变量可以保证下一个读取操作会在前一个写操作之后发生。
public class Singleton {
private static volatile Singleton instance = null;
private Singleton() { }
public static Singleton getInstance() {
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}