多線程的2種單例模式寫法

package com.bjsxt.base.conn011;

/**
 * 多線程單列 第一種寫法,最簡單。
 * @author Administrator
 *
 */
public class InnerSingleton {
	
	private static class Singletion {
		private static Singletion single = new Singletion();
	}
	
	public static Singletion getInstance(){
		return Singletion.single;
	}
	
}

 

package com.bjsxt.base.conn011;

/**
 * @author Administrator
 *多線程單列模式第二種寫法,兩個if判斷
 */
public class DubbleSingleton {

	private static DubbleSingleton ds;
	
	public static DubbleSingleton getDs(){
		if(ds == null){
			try {
				//模擬初始化對象的準備時間...
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			synchronized (DubbleSingleton.class) {
				if(ds == null){
					ds = new DubbleSingleton();
				}
			}
		}
		return ds;
	}
	
	public static void main(String[] args) {
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println(DubbleSingleton.getDs().hashCode());
			}
		},"t1");
		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println(DubbleSingleton.getDs().hashCode());
			}
		},"t2");
		Thread t3 = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println(DubbleSingleton.getDs().hashCode());
			}
		},"t3");
		
		t1.start();
		t2.start();
		t3.start();
	}
	
}

 

package com.bjsxt.base.conn011;
//普通的單列模式多個線程會創建多個對象
public class Singleton {
	
	private static Singleton s = null;
	private void Singleton(){
	}
	public static Singleton getS(){
		if(s == null){
			try {
				//模擬初始化對象的準備時間...
				Thread.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			s = new Singleton();
		}
		return s;
	}
	public static void main(String[] args) {
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				System.out.println(Singleton.getS().hashCode());
			}
		},"t1").start();
		new Thread(new Runnable() {
					
					@Override
					public void run() {
						System.out.println(Singleton.getS().hashCode());
					}
				},"t2").start();
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				System.out.println(Singleton.getS().hashCode());
			}
		},"t3").start();
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章