/**
* 单例模式
*/
public class SingleInstance {
private String name;
private static SingleInstance si=null;
private static Object syncObj=new Object();
/**
* 私有化构造函数,外界不能用new新建此实例
*/
private SingleInstance(){
}
/**
* 非线程安全的获取实例方法
*/
public static SingleInstance getNonThreadSafeInstance(){
if(si==null){
si=new SingleInstance();
}
return si;
}
/**
* 线程安全的获取实例方法:简单进行加锁对效率会有一定影响
*/
public static SingleInstance getThreadSafeInstance(){
synchronized(syncObj){
if(si==null){
si=new SingleInstance();
}
}
return si;
}
/**
* 线程安全的双重锁定获取实例方法:增加外层if判断增强多线程效率
*/
public static SingleInstance getThreadSafeDblLockInstance(){
if(si==null){
synchronized(syncObj){
if(si==null){
si=new SingleInstance();
}
}
}
return si;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 模拟客户端
*/
public static void main(String[] args) {
SingleInstance nonThreadSafeSi1=SingleInstance.getNonThreadSafeInstance();
nonThreadSafeSi1.setName("非线程安全单例1");
System.out.println(nonThreadSafeSi1.getName());
SingleInstance nonThreadSafeSi2=SingleInstance.getNonThreadSafeInstance();
System.out.println(nonThreadSafeSi2.getName());
System.out.println();
SingleInstance threadSafeSi1=SingleInstance.getNonThreadSafeInstance();
threadSafeSi1.setName("线程安全单例1");
System.out.println(threadSafeSi1.getName());
SingleInstance threadSafeSi2=SingleInstance.getNonThreadSafeInstance();
System.out.println(threadSafeSi2.getName());
System.out.println();
SingleInstance threadSafeDblLockSi1=SingleInstance.getNonThreadSafeInstance();
threadSafeDblLockSi1.setName("线程安全双重锁定单例1");
System.out.println(threadSafeDblLockSi1.getName());
SingleInstance threadSafeDblLockSi2=SingleInstance.getNonThreadSafeInstance();
System.out.println(threadSafeDblLockSi2.getName());
System.out.println();
}
}
/*
运行结果
非线程安全单例1
非线程安全单例1
线程安全单例1
线程安全单例1
线程安全双重锁定单例1
线程安全双重锁定单例1
*/
* 单例模式
*/
public class SingleInstance {
private String name;
private static SingleInstance si=null;
private static Object syncObj=new Object();
/**
* 私有化构造函数,外界不能用new新建此实例
*/
private SingleInstance(){
}
/**
* 非线程安全的获取实例方法
*/
public static SingleInstance getNonThreadSafeInstance(){
if(si==null){
si=new SingleInstance();
}
return si;
}
/**
* 线程安全的获取实例方法:简单进行加锁对效率会有一定影响
*/
public static SingleInstance getThreadSafeInstance(){
synchronized(syncObj){
if(si==null){
si=new SingleInstance();
}
}
return si;
}
/**
* 线程安全的双重锁定获取实例方法:增加外层if判断增强多线程效率
*/
public static SingleInstance getThreadSafeDblLockInstance(){
if(si==null){
synchronized(syncObj){
if(si==null){
si=new SingleInstance();
}
}
}
return si;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 模拟客户端
*/
public static void main(String[] args) {
SingleInstance nonThreadSafeSi1=SingleInstance.getNonThreadSafeInstance();
nonThreadSafeSi1.setName("非线程安全单例1");
System.out.println(nonThreadSafeSi1.getName());
SingleInstance nonThreadSafeSi2=SingleInstance.getNonThreadSafeInstance();
System.out.println(nonThreadSafeSi2.getName());
System.out.println();
SingleInstance threadSafeSi1=SingleInstance.getNonThreadSafeInstance();
threadSafeSi1.setName("线程安全单例1");
System.out.println(threadSafeSi1.getName());
SingleInstance threadSafeSi2=SingleInstance.getNonThreadSafeInstance();
System.out.println(threadSafeSi2.getName());
System.out.println();
SingleInstance threadSafeDblLockSi1=SingleInstance.getNonThreadSafeInstance();
threadSafeDblLockSi1.setName("线程安全双重锁定单例1");
System.out.println(threadSafeDblLockSi1.getName());
SingleInstance threadSafeDblLockSi2=SingleInstance.getNonThreadSafeInstance();
System.out.println(threadSafeDblLockSi2.getName());
System.out.println();
}
}
/*
运行结果
非线程安全单例1
非线程安全单例1
线程安全单例1
线程安全单例1
线程安全双重锁定单例1
线程安全双重锁定单例1
*/