黑马程序员技术交流社区
标题:
单例设计模式问题
[打印本页]
作者:
菊花爆满山
时间:
2016-7-23 23:41
标题:
单例设计模式问题
package com.itheima.demo;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import org.junit.Test;
/**
* 单例设计模式有几种实现方式:
* 首先是关于单例设计模式的定义:
* 所谓单例就是在堆内存中只存在该类的一个实例
* 优点:提高程序的性能,减少了内存的开销
* 缺点:多线程并发问题
*
* @author Administrator
*
*/
public class Demo1 {
@Test
public void test() {
//饿汉式和懒汉式、静态内部类方式的测试
Single3 instance1 = Single3.getInstance();
Single3 instance2 = Single3.getInstance();
System.out.println(instance1==instance2);
}
/**
* 分析 对于以饿汉式和懒汉式、静态内部类方式需要注意序列化的问题
* 处理方法是:在单例类中加上readResovle方法,那么readObject就会去调用readResovle方法
* @throws IOException
* @throws FileNotFoundException
*/
@Test
public void test2() throws Exception {
Single3 instance1 = Single3.getInstance();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:/temp/test.txt"));
oos.writeObject(instance1);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/temp/test.txt"));
Object readObject = ois.readObject();
System.out.println(instance1==readObject);
}
@Test
/**
* 枚举的方式不会出现线程并发和序列化的问题
*/
public void test3() {
//枚举方式的测试
Single4 single1 = Single4.single;
Single4 single2 = Single4.single;
System.out.println(single1==single2);
}
}
/**
* 饿汉式
* @author Administrator
*
*/
class Single {
private final static Single single = new Single();
private Single(){}//私有构造方法
public static Single getInstance() {
return single;
}
}
/**
* 懒汉式 存在线程安全问题
class Single2 {
private static Single2 single2 = null;
private Single2(){}//私有构造方法
public static Single2 getInstance() {
if(single2==null) {
single2 = new Single2();
}
return single2;
}
}
*/
/**
* 懒汉式 对线程安全问题的解决
*/
class Single2 {
private static Single2 single2 = null;
private Single2(){}//私有构造方法
public static Single2 getInstance() {
if(single2==null) {
//加锁 同步代码块
synchronized (Single2.class) {
//线程安全机制耗费资源 这里再加一次判断可以提高效率
if(single2==null) {
single2 = new Single2();
}
}
}
return single2;
}
}
/**
* 静态内部类的方式实现单例
*/
class Single3 implements Serializable{
private static final long serialVersionUID = 1L;
private Single3(){}
public static Single3 getInstance() {
return SingleDemo.single;
}
private static class SingleDemo {
private final static Single3 single = new Single3();
}
//处理反序列化导致的两个实例的问题
public Object readResolve() {
return SingleDemo.single;
}
}
/**
* 枚举的方式
*/
enum Single4 {
single;
}
复制代码
作者:
qetu001212
时间:
2016-7-23 23:49
棒棒哒!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2