我正在学习一些设计模式并发现了惊人的单例!
实现单例模式似乎有两种主要方式——一种是线程安全的(使用synchronized
关键字),另一种不是线程安全的。
我的问题是,什么时候不想让他们的单例线程安全?即使最初的程序设计没有实现线程,也可能无法说明未来的迭代会有这种需求。使单例线程安全时是否存在性能损失?或者我遗漏的其他一些原因,在线程安全的单例中没有优势?
示例线程安全单例:
/**
* Thread Safe Singleton Pattern
*
*/
public class Database {
private volatile static H2 uniqueInstance;
public static H2 getInstance() {
if (Database.uniqueInstance == null) {
synchronized (Database.class) {
if (Database.uniqueInstance == null) {
/**
* Instantiate First and Only instance of H2
*/
Database.uniqueInstance = new H2();
}
}
}
return Database.uniqueInstance;
}
private Database() {};
}
示例非线程安全单例:
/**
* Non Thread Safe Singleton Pattern
*
*/
public class Database {
private volatile static H2 uniqueInstance;
public static H2 getInstance() {
if (Database.uniqueInstance == null) {
/**
* Instantiate First and Only instance of H2
*/
Database.uniqueInstance = new H2();
}
}
return Database.uniqueInstance;
}
private Database() {};
}