synchronized 同步執行緒 單例設計模式+double checking

wangdongli_1993發表於2018-07-09
package xidian.lili.thread.syn;
//單例設計模式
public class SynDemo01 {


/**
* @param args
* @throws InterruptedException 
*/
public static void main(String[] args) throws InterruptedException {
/*(
Jvm j1=Jvm.getInstance(1000);
Jvm j2=Jvm.getInstance(1000);
System.out.println(j1==j2);//單執行緒結果地址是一樣的
*/
JvmThread t1=new JvmThread(10);
JvmThread t2=new JvmThread(200);
t1.start();
t2.start();
}


}
class JvmThread extends Thread{
private long time;
public JvmThread(){

}
public JvmThread(long time){
this.time=time;
}
@Override
public  void run() {
try {
System.out.println(Thread.currentThread().getName()+"執行緒 建立物件"+Jvm.getInstance2(time));
} catch (InterruptedException e) {

e.printStackTrace();
}//單執行緒結果地址是一樣的
}




class Jvm{
//建立私有靜態變數
private static Jvm jvm;
//構造器私有化  確保外部不能建立物件
private Jvm(){

}
//建立對外的公共靜態方法 訪問私有靜態變數    +同步方法
public synchronized static Jvm getInstance(long time) throws InterruptedException{
if(jvm==null){
Thread.sleep(time);//在多執行緒裡 幾個執行緒進來之後延時 下面建立就會建立兩次
jvm=new Jvm();
}
return jvm;
}
public static Jvm getInstance2(long time) throws InterruptedException{
synchronized(Jvm.class){//同步快 不能this物件  靜態方法中沒有this物件 放入類的位元組碼資訊 效率低  不管這個時候有沒有物件都要等待
if(jvm==null){
Thread.sleep(time);//在多執行緒裡 幾個執行緒進來之後延時 下面建立就會建立兩次
jvm=new Jvm();
}
return jvm;
}
}
public static Jvm getInstance3(long time) throws InterruptedException{
//雙重檢查
if(jvm==null){//如果已經有物件 執行緒都不在等待  沒有物件在進去
synchronized(Jvm.class){//同步快 不能this物件  靜態方法中沒有this物件 放入類的位元組碼資訊 效率低
if(jvm==null){
Thread.sleep(time);//在多執行緒裡 幾個執行緒進來之後延時 下面建立就會建立兩次
jvm=new Jvm();
}


}
}
return jvm;
}
}

相關文章