Java设计模式之单例设计模式总结
2024-09-29 01:16:21
package singleton; /**单例设计模式 饿汉式
*
* @author gx
*这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,
*虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法,
* 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,
* 这时候初始化instance显然没有达到lazy loading的效果。
*/
public class Ehan {
private static Ehan instance=new Ehan();
private Ehan(){}
public static Ehan getInstance(){
return instance;
} } package singleton;
/**单例设计模式饿汉式 变种
* 类初始化即实例化instance。
* @author gx
*
*/
public class EhanVarietal {
private static EhanVarietal instance=null;
static{
instance=new EhanVarietal();
}
private EhanVarietal(){} public static EhanVarietal getInstance(){
return instance;
} } package singleton; /**
* 单例设计模式懒汉式,线程不安全
* @author gx
* 这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。
*/
public class LanHan {
private static LanHan instance; // 私有构造方法
private LanHan() {
} // 提供公有的外部构造方法
public static LanHan getInstance() {
if (instance != null) {
instance = new LanHan();
}
return instance;
}
} package singleton; /**单例设计模式 懒汉式 线程安全
*
* @author gx
* 这种写法能够在多线程中很好的工作,
* 而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,99%情况下不需要同步。
*/
public class LanHanSafety { private static LanHanSafety instance; private LanHanSafety(){} public static synchronized LanHanSafety getInstance(){
if(instance==null){
instance=new LanHanSafety();
} return instance;
} } package singleton; /**单例设计模式 枚举类型
*
* @author gx
*
*/
public enum MeiJu {
INSTANCE; private String name;
private int age;
private MeiJu(){} public void whateverMethod(){} public static MeiJu getInstance(){
return INSTANCE;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() { return this.name+"-----"+this.age;
} } package singleton; /**单例设计模式 静态内部类
*
* @author gx
*
*/
public class StaticInnerClass {
private static class StaticInnerClassHolder{
private static final StaticInnerClass INSTANCE=new StaticInnerClass();
}
private StaticInnerClass(){}
public static StaticInnerClass getInstance(){
return StaticInnerClassHolder.INSTANCE;
}
} package singleton; /**
* 单例设计模式 双重验锁
*
* @author gx
*
*/
public class YanSuo {
private volatile static YanSuo instance; private YanSuo() {
} public static YanSuo getInstance() {
if (instance == null) {
synchronized (YanSuo.class) {
if (instance == null) {
instance = new YanSuo();
}
}
}
return instance;
}
}
最新文章
- Android获取屏幕实际高度跟显示高度,判断Android设备是否拥有虚拟功能键
- MYSQL的深入学习--优化步骤
- Codevs1026 逃跑的拉尔夫
- Maven_dependencies 和 dependencyManagement 的区别
- java数据结构
- CSS 笔记三(Tables/Box Model/Outline)
- 26.打印所有和为S的连续正整数序列[FindContinuousSequencesWithSumS]
- DOM节点-appendChild
- xll
- 抛出自定义异常,spring AOP事务不回滚的解决方案
- QVariant类学习(非常强大的类型,甚至能处理QMap<;QString ,QVariant>;)
- Bow模型(解释的很好)
- River Hopscotch(二分)
- SQL:deferrable initially deferred
- Java设计模式探讨之单例模式
- RabbitMQ配置
- Codeforces909D Colorful Points(缩点)
- Linux基础命令---dump
- 使用transient关键字解决ehcache序列化错误
- 面试题:输入两个整数 n 和 m,从数列1,2,3…….n 中 随意取几个数, 使其和等于 m
热门文章
- HihoCoder1642 : 三角形面积和([Offer收割]编程练习赛37)(求面积)(扫描线||暴力)(占位)
- bzoj 4514: 数字配对
- windows下vs2012用gsoap开发webservice实例
- bzoj 4278 Tasowanie —— 后缀数组
- 查看MySql数据库物理文件存放位置
- exosip 和 pjsip 简介
- Eclipse&;nbsp;安装插件
- day1 java基础回顾-IO流
- Spring Data JPA stackoverflow
- day03-CSS(1)