package com.xujy.thread;
public class SingleTone {
public static void main(String[] args) {
Single s1=Single.getInstance();
Single s2=Single.getInstance();
System.out.print(s1==s2);
Single1 s3=Single1.getInstance();
Single1 s4=Single1.getInstance();
System.out.print(s3==s4);
}
}
//懶漢模式(開始的時候不創建對象,調用的時候再創建實例對象),如果使用多線程的話會出現問題,可能兩個線程都進入了判斷語句導致
//創建了多個對象,可以採取添加同步鎖的方式來保證線程安全
class Single{
private static Single single=null;//構建私有的成員類變量並賦值爲null
private Single(){}//構造器私有化,不允許在其他類裏創建new出該類的對象
public static Single getInstance(){//聲明爲public在其他類裏可以調用該方法來實例化對象;static可以類名直接調用該方法來實例化對象。
if(single==null){//提高效率,第一個線程進去之後,對象不爲空之後,其它線程就不會等待
synchronized (Single.class) {//效率比較低,當一個線程進去之後,其它線程依然會等待進入
if(single==null){
single=new Single();
}
}
}
return single;
}
}
//餓漢模式
class Single1{
private static Single1 s1=new Single1();//開始就創建一個對象,並且該對象是私有的
private Single1(){}//構造器私有化,不允許該類在創建對象
public static Single1 getInstance(){
return s1;
}
}