1.Eager
public class EagerInitialization {
private static Resource resource = new Resource();
public static Resource getResource() {
return resource;
}
static class Resource {
}
}
2.Lazy
public class SafeLazyInitialization {
private static Resource resource;
public synchronized static Resource getInstance() {
if (resource == null)
resource = new Resource();
return resource;
}
static class Resource {
}
}
3.double checked locking singleton ( 僅適用于java 5.0 以上版本)
public class DoubleCheckedLockingSingleton {
//java5.0 修改了內(nèi)存模型, 可以保證使用volatile 聲明的變量對于double checked locking是正確的
private volatile static DoubleCheckedLockingSingleton uniqueInstance;
private DoubleCheckedLockingSingleton() {}
public static DoubleCheckedLockingSingleton getInstance() {
if (uniqueInstance == null) {
synchronized (DoubleCheckedLockingSingleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new DoubleCheckedLockingSingleton();
}
}
}
return uniqueInstance;
}
}
4.Lazy initialization holder class idiom
public class ResourceFactory {
//增加一個helper類來初始化對象
private static class ResourceHolder {
public static Resource resource = new Resource();
}
public static Resource getResource() {
return ResourceFactory.ResourceHolder.resource;
}
static class Resource {
}
}
以上四種方法都是線程安全的實(shí)現(xiàn)方式
public class EagerInitialization {
private static Resource resource = new Resource();
public static Resource getResource() {
return resource;
}
static class Resource {
}
}
2.Lazy
public class SafeLazyInitialization {
private static Resource resource;
public synchronized static Resource getInstance() {
if (resource == null)
resource = new Resource();
return resource;
}
static class Resource {
}
}
3.double checked locking singleton ( 僅適用于java 5.0 以上版本)
public class DoubleCheckedLockingSingleton {
//java5.0 修改了內(nèi)存模型, 可以保證使用volatile 聲明的變量對于double checked locking是正確的
private volatile static DoubleCheckedLockingSingleton uniqueInstance;
private DoubleCheckedLockingSingleton() {}
public static DoubleCheckedLockingSingleton getInstance() {
if (uniqueInstance == null) {
synchronized (DoubleCheckedLockingSingleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new DoubleCheckedLockingSingleton();
}
}
}
return uniqueInstance;
}
}
4.Lazy initialization holder class idiom
public class ResourceFactory {
//增加一個helper類來初始化對象
private static class ResourceHolder {
public static Resource resource = new Resource();
}
public static Resource getResource() {
return ResourceFactory.ResourceHolder.resource;
}
static class Resource {
}
}
以上四種方法都是線程安全的實(shí)現(xiàn)方式

