天天看點

JAVA多線程與單列模式--同步示範

public class SynSingletion {

 public static void main(String[] args){

  ThreadInstance ti=new ThreadInstance(); //使用時建立單列模式

  Thread t1=new Thread(ti);

  Thread t2=new Thread(ti);

  t1.start();   //使該線程開始執行;Java 虛拟機調用該線程的 run 方法。

  t2.start();   //虛拟機内部是怎麼實作自動調用run()方法的,我們不用管。

  try {

   Thread.sleep(5000);  //放大錯誤,時間越大捕獲錯誤準确率越高,防止CPU沒有執行完其它線程

   System.out.println("如果出現數字是2證明我已經被第一個線程建立的對象覆寫:"+InstanceOnly.getFlag());

  } catch (InterruptedException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

 }

}

//由于是多線程,線程并行運作,是以可能會建立多個對象,

//後來建立的對象會覆寫之前的對象,達不到單列模式效果

class ThreadInstance implements Runnable{

 private int i=0;

 public void run(){

  i++;

  InstanceOnly.getInstance(i);      //建立單列對象

 }

}

//下面是單列模闆,沒有使用線程同步鎖定

class InstanceOnly {

 private static int flag=0;     //标記,記錄是不是建立了2個對象

 private static InstanceOnly instance; 

 private InstanceOnly(){      //私有化構造函數,不被外界初始化

 }

 public static InstanceOnly getInstance(int flag){

//  synchronized(InstanceOnly.class){   //類名.class為對象的模闆

  if(null==instance){

   InstanceOnly.setFlag(flag);

   System.out.println("建立:"+(instance=new InstanceOnly()).toString());

  }

//  }

  return instance;

 }

 public static int getFlag() {

  return flag;

 }

 public static void setFlag(int flag) {

  InstanceOnly.flag = flag;

 }

}

--------------------------------------------以上是JAVA多線程建立單列模式與同步的示範代碼,

---------------------------------------------目的:提供最大直覺性參考。加強邏輯思維。