单例模式和多线程

来源:互联网 发布:拆分系统源码下载 编辑:程序博客网 时间:2024/05/16 12:16
package me.mymilkbottles;import java.io.*;/** * Created by Administrator on 2017/07/17 15:14. */public class SingletonParrern {    public static void main(String[] args) throws Exception {        testSingleton();//        testSerializable();    }    private static void testSerializable() throws Exception {        Object object = MyObject.getSingleObject();        FileOutputStream fileOutputStream = new FileOutputStream(new File("object.txt"));        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);        objectOutputStream.writeObject(object);        objectOutputStream.close();        fileOutputStream.close();        System.out.println(object);        FileInputStream fileInputStream = new FileInputStream(new File("object.txt"));        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);        Object readObject = objectInputStream.readObject();        System.out.println(readObject);        objectInputStream.close();        fileInputStream.close();    }    private static void testSingleton() throws InterruptedException {        final int SIZE = 5000;        Thread[] threads = new Thread[SIZE];        final Object[] objects = new Object[SIZE];        for (int i = 0; i < SIZE; ++i) {            final int finalI = i;            threads[i] = new Thread(new Runnable() {                @Override                public void run() {                    objects[finalI] = Singleton8.getSingleObject();                }            });        }        for (int i = 0; i < SIZE; ++i) {            threads[i].start();        }        Thread.sleep(3000);        for (int i = 1; i < SIZE; ++i) {            if (objects[i] != objects[i-1]) {                System.out.println("error");            }        }        System.out.println("ok");    }}//立即加载、恶汉式class Singleton1 {    private static final Object obj = new Object();    public static Object getSingleObject() {        return obj;    }}//延迟加载、懒汉式  多线程不安全class Singleton2 {    private static Object obj;    public static Object getSingleObject() {        if (obj == null) {            try {                Thread.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }            obj = new Object();        }        return obj;    }}//延迟加载、懒汉式  多线程安全 效率低class Singleton3 {    private static Object obj;    synchronized public static Object getSingleObject() {        if (obj == null) {            try {                Thread.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }            obj = new Object();        }        return obj;    }}//DCL(double-check locking)双检查锁机制class Singleton4 {    private static Object obj;    public static Object getSingleObject() {        if (obj == null) {            try {                Thread.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }            synchronized (Singleton4.class) {                if (obj == null) {                    obj = new Object();                }            }        }        return obj;    }}//使用静态内置类class Singleton5 {    static class SingletonInner {        private static final Object obj = new Object();    }    public static Object getSingleObject() {        return SingletonInner.obj;    }}//序列化和反序列化的单例模式实现class MyObject implements Serializable {    static class MyObjectInner {        private static final Object obj = new MyObject();    }    private MyObject(){}    public static Object getSingleObject() {        return MyObject.MyObjectInner.obj;    }    protected Object readResolve() throws ObjectStreamException {        return MyObject.MyObjectInner.obj;    }}//使用static代码块实现单例模式class Singleton6 {    private static final Object obj;    static {        obj = new Object();    }    public static Object getSingleObject() {        return obj;    }}//使用enum枚举数据类型实现单例模式//使用枚举类时,构造方法将会被自动调用,可以使用这个特性实现单例模式enum Singleton7 {    obj;    private Object object;    Singleton7() {        try {            Thread.sleep(100);        } catch (InterruptedException e) {            e.printStackTrace();        }        object = new Object();    }    public static Object getSingleObject() {        return obj;    }}//将枚举类隐藏起来class Singleton8 {    private enum SingletonEnum {        obj;        private Object object;        SingletonEnum() {            try {                Thread.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }            object = new Object();        }    }    public static Object getSingleObject() {        return SingletonEnum.obj;    }}
原创粉丝点击