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多線程建立單列模式與同步的示範代碼,
---------------------------------------------目的:提供最大直覺性參考。加強邏輯思維。