一、 懒汉模式
public class MyObject {
//立即记载方式==饿汉模式
private static MyObject myObject = new MyObject();
private MyObject(){
}
public static MyObject getInstance() {
//因为getInstance()方法没有同步,会出现非线程安全
return myObject;
}
}
二、延迟加载 / 懒汉模式
public class MyObject {
//立即记载方式==饿汉模式
private static MyObject myObject;
private MyObject() {
}
public static MyObject getInstance() {
//延迟加载
if (myObject != null) {
myObject = new MyObject();
}
return myObject;
}
}
三、 同步代码块/ 延迟加载 / 懒加载
public class MyObject {
private static MyObject myObject;
private MyObject() {
}
public static MyObject getInstance() {
//此写法等同于:
//synchronized public static MyObject getInstance()的写法,效率一样很低,全部代码被上锁
synchronized (MyObject.class){
if (myObject == null){
myObject = new MyObject();
}
}
return myObject;
}
}
public class MyObject {
private static MyObject myObject;
private MyObject() {
}
public static MyObject getInstance() {
if (myObject == null) {
//效率是提高了
//非线程安全
synchronized (MyObject.class) {
myObject = new MyObject();
}
}
return myObject;
}
}
四、使用DCL双检查机制来实现多线程环境中的延迟加载单例模式
public class MyObject {
private volatile static MyObject myObject;
private MyObject(){
}
//使用双检查机制来解决问题,即保证了不需要同步代码的异步执行性
//又保证了单例的效果
public static MyObject getInstance(){
try {
if (myObject == null){
synchronized (MyObject.class){
if (myObject == null){
myObject = new MyObject();
}
}
}
}catch (Exception e){
e.printStackTrace();
}
return myObject;
}
}
五、使用静态内置类实现单例模式
(线程安全,但是遇到序列化对象时,使用默认的方式运行得到德结果还是多例的。
public class MyObject {
private static class MyObjectHandler {
private static MyObject myObject = new MyObject();
}
private MyObject(){
}
public static MyObject getInstance(){
return MyObjectHandler.myObject;
}
}
六、序列化与反序列化的单例模式实现
public class MyObject implements Serializable {
private static final long serialVersionUID = 869L;
//内部类方式
private static class MyObjectHandler {
private static final MyObject myObject= new MyObject();
}
private MyObject(){
}
public static MyObject getInstance(){
return MyObjectHandler.myObject;
}
}
七、使用static代码块实现单例模式
public class MyObject {
private static MyObject instance = null;
private MyObject(){
}
static {
instance = new MyObject();
}
public static MyObject getInstance() {
return instance;
}
}
八、使用enum枚举书籍类型实现单例模式
public enum MyObject {
INSTANCE;
private Object data;
public Object getData(){
return data;
}
public void setData(Object data) {
this.data = data;
}
public static MyObject getInstance() {
return INSTANCE;
}
}