单例设计模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
懒汉单例模式
Singleton.java
package zx.singleton.test1;
public class Singleton {
private static Singleton instance;
//私有化构造函数
private Singleton(){}
//创建公共的静态方法获取单个实例
/**
* 当instance为null时,并且同时有两个线程调用getInstance()方法时,
* 他们都想进入第一重instance==null的判断。由于锁机制,这两个线程只有一个进入,
* 另一个在外面排队。当第一个创建了实例后,如果没有第二个instance==null的判断,
* 则的二个线程会进入继续创建实例,就不能达到单例的目的。
* @return
*/
public static Singleton getInstance(){
if(instance==null){
synchronized ("lock") {
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
Test.java
public class Test {
public static void main(String[] args) {
Singleton instance1 = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
if(instance1==instance2){
System.out.println("两个是相同的实例");
}
}
}
饿汉模式
/**
* 饿汉单例模式
* @author Carl_Hugo
*/
//组织该类被继承,防止产生新的实例
public final class Singleton2 {
//第一次引用类的任何成员时创建实例,在类被加载时创建实例
private static final Singleton2 singleton2=new Singleton2();
//私有化构造函数
private Singleton2(){}
//创建公共的静态方法获取实例
public static Singleton2 getInstance(){
return singleton2;
}
}
Test.java
public class Test {
public static void main(String[] args) {
// Singleton instance1 = Singleton.getInstance();
// Singleton instance2 = Singleton.getInstance();
Singleton2 instance1 = Singleton2.getInstance();
Singleton2 instance2 = Singleton2.getInstance();
if(instance1==instance2){
System.out.println("两个是相同的实例");
}
}
}