import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 单例模式
* 要点:私有化构造函数
* 对象为类的属性
*/
public class Singleton {
public static void main(String[] args) {
//可以用对象方法
Singleton_01 singleton_01 = Singleton_01.getSingleton_01();
//直接用类的方法
Singleton_01.doSomething();
}
}
//饿汉,线程安全
class Singleton_01{
private Singleton_01(){}//1.私有化,不让外部创建
private static Singleton_01 singleton_01 = new Singleton_01();//2.类加载的时候就创建
//必须为静态哇,不然外面调不了
public static Singleton_01 getSingleton_01(){
return singleton_01;
}
//类中其他方法,尽量是static,类方法,与对象没啥关系
public static void doSomething(){
}
}
//懒,线程有隐患,用个加锁解决吧
class Singleton_02{
static Lock lock = new ReentrantLock();
private Singleton_02(){}
private static Singleton_02 singleton_02 = null;
public static Singleton_02 getSingleton_02(){
lock.lock();
//线程同时卡在这儿的话,会进入再次创建
if (singleton_02 == null) {
singleton_02 = new Singleton_02();
}
lock.unlock();
return singleton_02;
}
}
//双重加锁,当已经创建过实例对象后就无需加锁,提高效率
class Singleton_03 {
private Singleton_03(){}
private static Singleton_03 singleton;
public static Singleton_03 getInstance(){
if(singleton == null){
synchronized(Singleton_03.class){
if(singleton == null){
singleton = new Singleton_03();
}
}
}
return singleton;
}
}