24种设计模式之单例模式(singleton)
24种设计模式之单例模式(singleton)
饿汉模式:推荐使用
package com.dahan;
/**
* 饿汉式:推荐使用
* 简单使用 JVM堆内存中种只有一个线程安全
*/
public class PersonTest {
private static final PersonTest INSTANCE = new PersonTest();
/**
* 私有的构造方法 避免别人new一个对象
*/
private PersonTest(){
}
public static PersonTest getInstance() {
return INSTANCE;
}
public void m(){
System.out.println("单例饿汉模式");
}
/**
* 测试方法
* @param args
*/
public static void main(String[] args) {
PersonTest instance1 = PersonTest.getInstance();
PersonTest instance2 = PersonTest.getInstance();
// 判断是否为一个实例
System.out.println(instance1 == instance2);// true
}
}
懒汉模式:不推荐
- 按需加载,不占用过多内存
- 需要处理线程不安全
- 加锁线程钱安全,但效率低
package com.dahan;
/**
* 懒汉式:不推荐
* 效率低 需要处理线程不安全
*/
public class PersonTest2 {
private static PersonTest2 INSTANCE = null;
/**
* 私有的构造方法 避免别人new一个对象
*/
private PersonTest2(){
}
public static PersonTest2 getInstance() {
if(INSTANCE == null){
// 双重检查
synchronized (PersonTest2.class){
if(INSTANCE == null){
INSTANCE = new PersonTest2();
}
}
}
return INSTANCE;
}
public void m(){
System.out.println("单例懒汉模式");
}
/**
* 测试方法
* @param args
*/
public static void main(String[] args) {
PersonTest2 instance1 = PersonTest2.getInstance();
PersonTest2 instance2 = PersonTest2.getInstance();
// 判断是否为一个实例
System.out.println(instance1 == instance2);
}
}
静态内部类模式:推荐 最完美的方式
package com.dahan;
/**
* 静态内部类模式:推荐使用 最完美的方式
* 简单使用 JVM堆内存中种只有一个线程安全
*/
public class PersonTest3 {
/**
* 私有的构造方法 避免别人new一个对象
*/
private PersonTest3() {
}
/**
* 静态内部类
*/
private static class PersonTest3Holder {
private final static PersonTest3 INSTANCE = new PersonTest3();
}
public static PersonTest3 getInstance() {
return PersonTest3Holder.INSTANCE;
}
public void m() {
System.out.println("m");
}
/**
* 测试方法
*
* @param args
*/
public static void main(String[] args) {
PersonTest3 instance1 = PersonTest3.getInstance();
PersonTest3 instance2 = PersonTest3.getInstance();
// 判断是否为一个实例
System.out.println(instance1 == instance2);
}
}
java之父推荐:解决线程同步、反序列化解决等问题
package com.dahan;
/**
* java之父推荐:解决线程同步、反序列化解决等问题
*/
public enum PersonTest4 {
INSTANCE;
public void m() {
System.out.println("m");
}
/**
* 测试方法
*
* @param args
*/
public static void main(String[] args) {
PersonTest4 instance1 = PersonTest4.INSTANCE;
instance1.m();
PersonTest4 instance2 = PersonTest4.INSTANCE;
instance2.m();
// 判断是否为一个实例
System.out.println(instance1 == instance2);
}
}
本文来自博客园,作者:土木转行的人才,转载请注明原文链接