获取单例对象的代码
public class MyObject {
private MyObject(){}
private static MyObject object;
public static MyObject getInstance() {
try {
if (object == null) {
object = new MyObject();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return object;
}
}
当启动多个线程执行MyObject.getInstance()的时候,获取到的对象会有多个,解决办法:
- 在getInstance()方法上加synchronized关键字
public class MyObject { private MyObject(){}
private static MyObject object;
synchronized public static MyObject getInstance() {
try {
if (object == null) {
object = new MyObject();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return object;
}
}
这样整个方法会被上锁,效率低。
public class MyObject { private MyObject(){}
private static MyObject object;
public static MyObject getInstance() {
try {
if (object == null) {
synchronized(Myobject.class){
if(object==null){
object = new MyObject();
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return object;
}
}
public class MyObject {
private MyObject(){}
private static class MyObjectHandler{
private static MyObject myObject = new MyObject();
}
public static MyObject getInstance() {
return MyObjectHandler.myObject;
}
}
该方法在序列化及序列化的时候前后得到的对象会发生变化,添加readResove()方法即可:
public class MyObject implements Serializable {
private static final long serialVersionUID = 1L;
private MyObject(){}
private static class MyObjectHandler{
private static final MyObject myObject = new MyObject();
}
public static MyObject getInstance() {
return MyObjectHandler.myObject;
}
protected Object readResolve() throws ObjectStreamException{
System.out.println("调用了readResolve方法! ");
return MyObjectHandler.myObject;
}
}