# 普通的单例
public class QQ { public static void main(String[] args) throws InterruptedException { final CountDownLatch latch = new CountDownLatch(10); for (int i = 0; i < 10; i++) { new Thread() { @Override public void run() { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } MyClient.getInstance(); latch.countDown(); } }.start(); } latch.await(); System.out.println(MyClient.count); } } class MyClient { private static MyClient client; public static int count; private MyClient() { count++; } public static MyClient getInstance() { if (client == null) { client = new MyClient(); } return client; } }
# 普通的线程安全的单例
public class QQ { public static void main(String[] args) throws InterruptedException { final CountDownLatch latch = new CountDownLatch(10); for (int i = 0; i < 10; i++) { new Thread() { @Override public void run() { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } MyClient.getInstance(); latch.countDown(); } }.start(); } latch.await(); System.out.println(MyClient.count); } } class MyClient { private static MyClient client; public static int count; private MyClient() { count++; } public synchronized static MyClient getInstance() { if (client == null) { client = new MyClient(); } return client; } }
# 双重校验的线程安全的单例
public class QQ { public static void main(String[] args) throws InterruptedException { final CountDownLatch latch = new CountDownLatch(10); for (int i = 0; i < 10; i++) { new Thread() { @Override public void run() { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } MyClient.getInstance(); latch.countDown(); } }.start(); } latch.await(); System.out.println(MyClient.count); } } class MyClient { private static MyClient client; public static int count; private MyClient() { count++; } public static MyClient getInstance() { if (client == null) { getSynInstance(); } return client; } public synchronized static MyClient getSynInstance() { if (client == null) { client = new MyClient(); } return client; } }