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(); } }