实现线程安全的单例模式有多种方案,最常见的是使用 synchronized 关键字。但是这种方案在线程竞争激烈时开销比较大。今天介绍利用JVM类初始化的方式来实现单例模式。
jvm在进行类初始化时,为了保证线程安全,会提供在类初始化锁,保证该类只会被初始化一次。我们可以利用此特性来实现线程安全的单例模式。话不多说,亮出代码:
public class PoolMannager{
private static class createPool{
private static MyPoolImpl poolImpl = new MyPoolImpl ();
}
public static MyPoolImpl getInstance(){
return createPool.poolImpl ;
}
}
代码实现逻辑:
1、定义一个内部类,其中一个属性是需要创建的类的实例,注意使用static修饰;
2、定义返回的单例的方法,方法体中通过 内部类.单例对象属性 的方式返回单例对象。
内部类.单例对象属性,对静态属性的访问会触发对内部类的初始化,而类的初始化是线程安全的,所以利用此机制能保证线程安全地返回单例对象。