5种java中单例创建方式:
1、饿汉式:类加载类初始化时,会立即加载类对象,线程天生安全,调用效率高
2、懒汉式:类初始化时,不会立即加载对象,真正需要使用时才会创建,具有懒加载功能;但是创建时需要上锁以保证线程安全。这样会导致效率不高。
3、静态内部方式:结合了饿汉式、懒加载式的优点,真正需要对象才创建。具有线程安全。
4、枚举单例;枚举本身就是单例;
5、双重检测方式:因为JVM具有重拍机制,可能会创建多个对象,不建议使用。
饿汉式:
/**
*
*/
package com.zuk.test.menu;
/**
* @author
* 饿汉式
* 特点:在类初始化的时候就会创建对象,天生线程安全,调用效率比较高,如果在不适用对象的时候,会浪费内存
* 步骤:1、将构造函数私有化
*/
public class SingleonObject {
private static final SingleonObject singleonObject = new SingleonObject();
private SingleonObject(){}
public static SingleonObject getInstance(){
return singleonObject;
}
}
/**
*
*/
package com.zuk.test.menu;
/**
* @author
*
*/
public class SingleonObjectMain {
public static void main(String[] args) {
SingleonObject o1 = SingleonObject.getInstance();
SingleonObject o2 = SingleonObject.getInstance();
System.out.println(o1==o2); //返回时true
}
}
懒汉式
/**
*
*/
package com.zuk.test.menu;
/**
* @author
* 1、在需要使用的时候才创建对象,但是创建时不具备线程安全,需要上锁来保证线程安全。如此会导致使用效率非常低。
* 步骤:
* 1、私有化构造函数
* 2、上锁
*/
public class SingleonObj2 {
private static SingleonObj2 singleonObj2;
private SingleonObj2(){}
public static synchronized SingleonObj2 getInstance(){
if(singleonObj2!=null){
singleonObj2 = new SingleonObj2();
}
return singleonObj2;
}
}
枚举式
静态内部类
/**
*
*/
package com.zuk.test.menu;
/**
* @author HUANGLIAO322
* 枚举式创建单例
*/
public class Singleon {
private Singleon(){System.out.println("a");}
static class SingleonClass {
public static Singleon singleon = new Singleon();
}
public static Singleon getInstance(){
return Singleon.SingleonClass.singleon;
}
// public static void main(String[] args) {
// Singleon s1 = Singleon.getInstance();
// Singleon s2 = Singleon.getInstance();
// System.out.println(s1==s2);
// }
}