单例模式的目的就是只需要生成一个,所以在多线程下就要小心了
序列化和反序列化时,如果要保持单例,就写readResolve方法
饿汉模式
public class MyObject implements Serializable{
private static MyObject myObject = new MyObject();
/**
*
*/
private static final long serialVersionUID = -8869448265655948293L;
private MyObject() {
}
public static MyObject getInstance() {
return myObject;
}
protected Object readResolve() {
System.out.println("readResolve");
return myObject;
}
}
懒汉模式
public class MyObject implements Serializable {
/**
*
*/
private static final long serialVersionUID = -8869448265655948293L;
private static MyObject myObject;
private MyObject() {
}
public static MyObject getInstance() {
if (myObject == null) {
synchronized (MyObject.class) {
if (myObject == null) {
myObject = new MyObject();
}
return myObject;
}
}
return myObject;
}
}
内置类
public class MyObject implements Serializable{
/**
*
*/
private static final long serialVersionUID = 3079510141341239485L;
private static class MyObjectHandler{
private static final MyObject myObject= new MyObject();
}
private MyObject(){
}
public static MyObject getInstance() {
return MyObjectHandler.myObject;
}
//反序列化使用
protected Object readResolve() {
System.out.println("readResolve");
return MyObjectHandler.myObject;
}
}
enum枚举
public class MyObject{
public enum MyEnum{
object;
private MyObject myObject;
private MyEnum() {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
myObject = new MyObject();
}
private MyObject getObject() {
return myObject;
}
}
private MyObject() {
}
public static MyObject getMyObject() {
return MyEnum.object.getObject();
}
}
static代码块
public class MyObject implements Serializable{
/**
*
*/
private static final long serialVersionUID = -8869448265655948293L;
private static MyObject myObject;
private MyObject() {
}
static {
myObject = new MyObject();
}
public static MyObject getInstance() {
return myObject;
}
protected Object readResolve() {
System.out.println("readResolve");
return myObject;
}
}
测试类
public class Test02 {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(MyObject.getMyObject().hashCode());
}
};
for (int i = 0; i < 10; i++) {
new Thread(runnable).start();
}
}
}
反序列化测试
package test2019.线程学习.第六章;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import test2019.线程学习.第六章.饿汉模式.MyObject;
public class Test {
public static void main(String[] args) {
MyObject object = MyObject.getInstance();
try {
FileOutputStream fileOutputStream = new FileOutputStream(new File("object.txt"));
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(object);
objectOutputStream.close();
fileOutputStream.close();
System.out.println(object.hashCode());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
FileInputStream fileInputStream = new FileInputStream(new File("object.txt"));
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
MyObject obj2;
obj2 = (MyObject) objectInputStream.readObject();
objectInputStream.close();
fileInputStream.close();
System.out.println(obj2.hashCode());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}