设计模式____单列模式(懒加载,常加载,双检索,线程安全问题)
2017-05-08 09:59
477 查看
//简介:
1.保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2.判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
3.这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象
//参考:http://www.runoob.com/design-pattern/singleton-pattern.html
//============单列模式中的方法调用和java中Calendar非常规单例模式使用=========================\\
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.UUID;
/**
* @author Administrator
* 高并发_双检锁_保证唯一性I避免D重复
*/
public class GuidUtil {
/**
* Douoble Loack Singleton Module
*/
private volatile static GuidUtil singleton;
private GuidUtil() {
}
public static GuidUtil getSingleton() {
if (singleton == null) {
synchronized (GuidUtil.class) {
if (singleton == null) {
singleton = new GuidUtil();
}
}
}
return singleton;
}
/**
* GetUUID 方法不建议static修饰
*/
public String getRandomUUID(){
String uuid=UUID.randomUUID().toString().replaceAll("-","");
return uuid;
}
public static String getTime(){
String str =System.currentTimeMillis()+"";
return str;
}
}
1.保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2.判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
3.这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象
//参考:http://www.runoob.com/design-pattern/singleton-pattern.html
package com.pattern.singleton.lazyLoad; /** * @author Living thirty-two years * 加载方式:懒加载 * 线程安全:线程不安全,多线程下无法使用 * 第一次调用才初始化,避免内存浪费。 */ public class SingleModule { //定义一个全局实例对象 private static SingleModule instance=null; //私有构造器 private SingleModule(){} //公共获取该实例的方法 public static SingleModule getInstance(){ if(instance==null){ instance=new SingleModule(); } return instance; } //方法 public static void OpenDB(){ System.out.println("打开数据库..."); } }
package com.pattern.singleton.lazyLoad; /** * @author Living thirty-two years * 加载方式:懒加载 * 线程安全:线程安全,多线程下可以使用 * 第一次调用才初始化,避免内存浪费。 */ public class SingleModuleSafe { // 定义一个全局实例对象 private static SingleModuleSafe instance = null; //私有构造器 private SingleModuleSafe() { } //方法 public static synchronized SingleModuleSafe getInstance() { if (instance == null) { instance = new SingleModuleSafe(); } return instance; } }
package com.pattern.singleton.lazyLoad; /** * @author Living thirty-two years * 加载方式:懒加载 * 线程安全:线程安全 * 这种方式采用双锁机制,安全且在多线程情况下能保持高性能。 */ public class SingleModuleDoubleLock { private volatile static SingleModuleDoubleLock singleton; private SingleModuleDoubleLock() { } public static SingleModuleDoubleLock getSingleton() { if (singleton == null) { synchronized (SingleModuleDoubleLock.class) { if (singleton == null) { singleton = new SingleModuleDoubleLock(); } } } return singleton; } }
package com.pattern.singleton.generalLoad; /** * @author Living thirty-two years 加载方式:普通加载 线程安全:线程安全 * 描述:这种方式比较常用,但容易产生垃圾对象。没有加锁,执行效率会提高。缺点:类加载时就初始化,浪费内存 */ public class SingleModule { private static SingleModule instance = new SingleModule(); private SingleModule() { } public static SingleModule getInstance() { return instance; } }
//============单列模式中的方法调用和java中Calendar非常规单例模式使用=========================\\
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.UUID;
/**
* @author Administrator
* 高并发_双检锁_保证唯一性I避免D重复
*/
public class GuidUtil {
/**
* Douoble Loack Singleton Module
*/
private volatile static GuidUtil singleton;
private GuidUtil() {
}
public static GuidUtil getSingleton() {
if (singleton == null) {
synchronized (GuidUtil.class) {
if (singleton == null) {
singleton = new GuidUtil();
}
}
}
return singleton;
}
/**
* GetUUID 方法不建议static修饰
*/
public String getRandomUUID(){
String uuid=UUID.randomUUID().toString().replaceAll("-","");
return uuid;
}
public static String getTime(){
String str =System.currentTimeMillis()+"";
return str;
}
}
import java.util.Calendar; public class DataCheckUtil { public static void main(String[] args) { /** * 单列模式调用 */ GuidUtil guidUtil=GuidUtil.getSingleton(); //单列模式方法调用 String id= guidUtil.getRandomUUID(); System.out.println("单列模式方法调用:"+id); //这是常规的方法调用 String str= GuidUtil.getTime(); System.out.println("常规的方法调用:"+str); /** * JDK中类的单列模式的应用 */ Calendar calendar=Calendar.getInstance(); calendar.getFirstDayOfWeek(); } }
相关文章推荐
- [置顶] Java 多线程学习笔记(十一) 单例设计模式(延迟加载/懒汉模式)DCL解决线程安全问题
- 设计模式(一)--深入单例模式(涉及线程安全问题)
- 详解单例设计模式的线程安全问题
- 解决单例设计模式中懒汉式线程安全问题
- 单例设计模式:饿汉式、懒汉式、枚举方式。以及涉及到的线程安全问题和反射机制问题。
- java设计模式--解决单例设计模式中懒汉式线程安全问题
- 完美解决单例设计模式中懒汉式线程安全的问题
- 多线程三,同步函数、静态同步函数和单例设计模式中懒汉式即延迟加载模式的多线程问题(毕向东老师)
- 单例设计模式及懒汉式线程安全问题
- 单例设计模式的线程安全问题(转)
- 解决单例设计模式中的懒汉设计模式存在线程安全问题(并且在一定程度上提高效率)的一种解决方法
- 解决单例设计模式中懒汉式线程安全问题
- Java设计模式-单例模式及线程安全问题
- 设计模式:单例模式及其线程安全
- : 尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。 ---> System.BadImageFormatException: 试图加载格式不正确的程序。
- 从源码的角度带你分析Glide整体加载流程以及设计模式
- Mybatis3源码分析(08)-加载Configuration-使用到的设计模式
- 生产消费者模式实现方式和线程安全问题代码示例
- 常用设计模式举例,观察者模式,装饰模式,工厂模式,单列模式---Head Frist 设计模式源码
- java单列设计模式