1.懒汉式
/**
* 懒汉式,线程不安全
*/
public class SingleObject {
//创建 SingleObject 的一个对象
private static SingleObject instance;
//让构造函数为 private,这样该类就不会被实例化
private SingleObject(){}
//获取唯一可用的对象
public static SingleObject getInstance(){
if (instance==null){
instance = new SingleObject();
}
return instance;
}
public void showMessage(){
System.out.println("Hello World!");
}
}
2.懒汉式
/**
* 懒汉式,加锁保证安全,但是性能差
*/
public class SingleObject2 {
//创建 SingleObject 的一个对象
private static SingleObject2 instance2;
//让构造函数为 private,这样该类就不会被实例化
private SingleObject2(){}
//加锁保证线程安全
public static synchronized SingleObject2 getInstance(){
if (instance2==null){
instance2 = new SingleObject2();
}
return instance2;
}
public void showMessage(){
System.out.println("Hello World!");
}
}
3.饿汉式
/**
* 饿汉式,浪费内存
*/
public class SingleObject3 {
private static SingleObject3 instance3 = new SingleObject3();
private SingleObject3(){}
public static SingleObject3 getInstance(){
return instance3;
}
public void showMessage(){
System.out.println("Hello World!");
}
}
4.静态内部类
/**
* 静态内部类单例
*/
public class SingleObject5 {
private static class SingletonHolder {
private static final SingleObject5 INSTANCE = new SingleObject5();
}
private SingleObject5 (){}
public static final SingleObject5 getInstance() {
return SingletonHolder.INSTANCE;
}
}
5.双重锁
/**
* 双重锁懒汉式 volatile 防止内存重排,原子性加锁
*/
public class SingleObject4 {
private volatile static SingleObject4 singleton;
private SingleObject4 (){}
public static SingleObject4 getSingleton() {
if (singleton == null) {
synchronized (SingleObject4.class) {
if (singleton == null) {
singleton = new SingleObject4();
}
}
}
return singleton;
}
}
6.枚举
/**
* 枚举单例
*/
public enum SingleObject6 {
// 唯一枚举:
INSTANCE;
private String name = "world";
SingleObject6() {
System.out.println("构造函数");
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
Comments | NOTHING