引言:
使用java中的同步机制可以将单例模式中的“懒汉式”改写为线程安全的。而“饿汉式”单例模型本身就是线程安全的。
本身就是线程安全的“饿汉式”单例模式
class Bank {
//1.私有化类的构造器
private Bank() {}
//2.内部创建该类的对象
//4.要求此对象也必须声明为静态的
private static Bank instance = new Bank();
//3.提供公共的静态方法,返回类的对象
public static Bank getInstance() {
return instance;
}
}
非线程安全的“懒汉式”单例模式
class Bank {
//1.私有化类的构造器
private Bank() {}
//2.声明当前类对象,没有初始化
//4.此对象也必须声明为static的
private static Bank instance = null;
//3.声明public、static的返回当前类对象的方法
public static Bank getInstance() {
if (instance == null) {
instance = new Bank();
}
return instance;
}
}
利用同步机制将“懒汉式”单例模式改写成线程安全的
- 同步代码块,显式给出同步监视器(同步锁)
class Bank {
private static Bank instance = null;
private Bank() {}
private static Bank getInstance() {
/*方式一:效率稍差
synchronized (Bank.class) {
if (instance == null) {
instance = new Bank();
}
return instance;
}
*/
//方式二:效率更好
if (instance == null) {
synchronized (Bank.class) {
if (instance == null) {
instance = new Bank();
}
}
}
return instance;
}
}
- 同步方法
class Bank {
private static Bank instance = null;
private Bank() {}
//此时该同步方法的同步监视器(锁)为该类本身
private static synchronized Bank getInstance() {
if (instance == null) {
instance = new Bank();
}
return instance;
}
}