线程安全的单例-懒汉

# 普通的单例

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

 

上一篇:Uva 12171 离散化加BFS


下一篇:nodeMCU Lua ESP8266第六课 公网控制ESP