一:饿汉式(第一种)
public class SingletonTest01 {
public static void main(String[] args) {
Singleton intance = Singleton.getIntance();
Singleton intance2 = Singleton.getIntance();
System.out.println(intance == intance2);
}
}
class Singleton{
//内部创建对象
private static final Singleton intance = new Singleton(); // 一上来就初始化实例,比较饿,因此是饿汉式
// 私有构造器,防止外部调用
private Singleton() {
}
// 提供共有静态方法,返回实例
public static Singleton getIntance() {
return intance;
}
}
二:饿汉式(第二种)
package designpattern.singleton.type1;
public class SingletonTest01 {
public static void main(String[] args) {
Singleton intance = Singleton.getIntance();
Singleton intance2 = Singleton.getIntance();
System.out.println(intance == intance2);
}
}
class Singleton{
//内部创建对象
private static Singleton intance ;
static {
intance = new Singleton();
}
// 私有构造器,防止外部调用
private Singleton() {
}
// 提供共有静态方法,返回实例
public static Singleton getIntance() {
return intance;
}
}
优缺点同上!!!
三:懒汉式(线程不安全)
public class SingletonTest2 {
public static void main(String[] args) {
Singleton2 intance = Singleton2.getIntance();
Singleton2 intance2 = Singleton2.getIntance();
System.out.println(intance == intance2);
}
}
class Singleton2{
//内部创建对象
private static Singleton2 intance ;
// 私有构造器,防止外部调用
private Singleton2() {
}
// 提供共有静态方法,返回实例
public static Singleton2 getIntance() {
if (intance == null) { // 只有用到时才会去创建 比较懒,因此是懒汉式
intance = new Singleton2();
}
return intance;
}
}
三:懒汉式(同步方法保证线程安全)
public class SingletonTest2 {
public static void main(String[] args) {
Singleton2 intance = Singleton2.getIntance();
Singleton2 intance2 = Singleton2.getIntance();
System.out.println(intance == intance2);
}
}
class Singleton2{
//内部创建对象
private static Singleton2 intance ;
// 私有构造器,防止外部调用
private Singleton2() {
}
// 提供共有同步静态方法,返回实例
public static synchronized Singleton2 getIntance() {
if (intance == null) { // 只有用到时才会去创建 比较懒,因此是懒汉式
intance = new Singleton2();
}
return intance;
}
}
四:懒汉式(双重检查推荐使用)
public class SingletonTest2 {
public static void main(String[] args) {
Singleton2 intance = Singleton2.getIntance();
Singleton2 intance2 = Singleton2.getIntance();
System.out.println(intance == intance2);
}
}
class Singleton2{
//内部创建对象
private static volatile Singleton2 intance ; // 加上volatile关键字,保证线程对它的可见性。
// 私有构造器,防止外部调用
private Singleton2() {
}
// 双重检查 ①解决线程安全问题②解决懒加载问题
public static Singleton2 getIntance() {
if (intance == null) {
synchronized (Singleton2.class) {
if (intance == null) {
intance = new Singleton2();
}
}
}
return intance;
}
}
五:静态内部类
package designpattern.singleton.type1;
public class SingletonTest2 {
public static void main(String[] args) {
Singleton2 intance = Singleton2.getIntance();
Singleton2 intance2 = Singleton2.getIntance();
System.out.println(intance == intance2);
}
}
// 静态内部类
class Singleton2 {
// 私有构造器,防止外部调用
private Singleton2() {
}
static class SingletonIntance {
private static final Singleton2 INTANCE = new Singleton2();
}
// 双重检查 ①解决线程安全问题②解决懒加载问题
public static Singleton2 getIntance() {
return SingletonIntance.INTANCE;
}
}
六:枚举
public class SingletonTest2 {
public static void main(String[] args) {
Singleton2 singgl = Singleton2.SINGGL;
Singleton2 singgl2= Singleton2.SINGGL;
System.out.println(singgl == singgl2);
}
}
//枚举
enum Singleton2 {
SINGGL;
public void say() {
System.out.println("hello枚举单例模式");
}
}
总结:推荐使用饿汉式,双重检查,静态内部类,和枚举方式!