浏览 1117 次
锁定老帖子 主题:singleton模式安全
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-04-17
public class Singleton{ private static Singleton instance = null; public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instace; } }假设这样一个场景,有两个线程调用Singleton.instance(),首先线程一判断instance是否等于null,判断完后一瞬间虚拟机把线程二调度为运行线程,线程二再次判断instance是否为null,然后创建一个Singleton实例,线程二的时间片用完后,线程一被唤醒,接下来它执行的代码依然是instance = new Singleton(); 两次调用返回了不同的对象,出现问题了。 解决方案:(1)类被载入时就初始化这个对象:private static Singleton instance = new Singleton(); JLS(Java Language Specification)中规定了一个类只会被初始化一次,所以这样做肯定是没问题的。 但是如果要实现延迟初始化(Lazy initialization),比如这个实例初始化时的参数要在运行期才能确定 (2)使用synchronized关键字修饰初始化方法: public synchronized static Singleton getInstace() { if (instance == null) { instance = new Singleton(); } return instance; } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |