您的位置:首页 > 其它

设计模式____单列模式(懒加载,常加载,双检索,线程安全问题)

2017-05-08 09:59 477 查看
//简介:

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();

}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐