单例模式的探索
单例模式时java中一个相当重要的设计模式,对于一个类,只能存在一个实例。比如在缓存中,全局的缓存应该是单一并且一致的。这里给出常见的单例模式的实现,并做了改进,使之成为线程安全的单例
饿汉式
在使用对象的时候已经加载完毕,常见的就是直接使用new关键字
public class Resource {
private static Object source = new Object();
private Resource() {
}
public static Object get() {
/**
* 使用类的时候 source对象已经加载完毕
* 他就是线程安全的,没有特殊情况
* 线程安全!
*/
return source;
}
}
懒汉式
懒汉式是指在getInstance()的时候创建实例,从代码实现中探究线程安全性吧
public class Resource {
private Object source;
private Resource() {
}
public Object getInstance() {
if (source == null) {
source = new Object();
}
return source;
}
}
两个线程同时调用getInstance()方法,他们同时发现source是空的,继而分别创建了object,解决方案很简单,在方法前加synchronized关键字,静态方法加锁会锁整个类,小了说,会锁住整个方法体,下面介绍一下DCL(Double Check Lock)机制
import java.util.concurrent.TimeUnit;
public class Resource {
private Object source;
private Resource() {
}
public Object getInstance() {
if (source == null) {
// 模拟对象构建所用的时间
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (Resource.class) {
if (source == null)
source = new Object();
}
}
return source;
}
}
如果对象是空的拿锁,拿到锁后检查一下对象是不是空的,如果不是空的就不需要操作了
静态内部类
感觉和饿汉式差不多
public class Resource {
private Object source;
private Resource() {
source = new Object();
}
private static class SourceHandler {
private static Resource resource = new Resource();
}
public Object getInstance() {
return SourceHandler.resource;
}
}
未完待续