单例模式和多线程
来源:互联网 发布:拆分系统源码下载 编辑:程序博客网 时间: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; }}
阅读全文
0 0
- 单例模式和多线程
- 单例模式和多线程
- 单例模式和多线程
- 单例模式和多线程
- 单例模式和多线程
- 单例模式和多线程
- 单例模式和多线程安全
- 单例模式和多线程安全
- [网络和多线程]9、单例模式
- 多线程单例模式
- Java多线程(PART XXI)多线程和单例模式
- 单例模式-多线程单例模式
- 单例和多线程
- 黑马程序员——多线程和单例设计模式
- 黑马程序员 多线程及其单例模式设计和GUI
- java多线程之单例模式和其DCL问题
- C# 多线程启动和管理 单例模式
- 单例模式与多线程
- Caysn打印机IOS平台打印开发包、接口说明文档及示例程序_20170717
- Java精选笔记_会话技术
- HTML骨架结构
- 选择排序
- 配置Webpack-dev-server+初步了解react中元素、组件、事件、props传递
- 单例模式和多线程
- iOS PDF使用CATiledLayer展示
- 第08讲 mysql添加数据
- The SetStack Computer集合栈计算器(stack的运用)
- Android binder
- 501. Find Mode in Binary Search Tree
- java算法学习笔记--线性表篇
- 7-17数组下
- Struts2学习笔记(1)