线程安全的单例模式面试常问:如何写出单例模式?

线程安全的单例模式面试的时候,常常会被问到这样一个问题: 请您写出一个 单例模式( )吧。好吧,写就写,这还不容易。顺手写一个: 1. final class 2. { 3. = new (); 4. 5. () { 6.} 7. 8. () { 9. ; 10.} 11. }这种写法就是所谓的饥饿模式, 每个对象在没有使用之前就已经初始化了。 这就可能带来潜在的性能问题: 如果这个对象很大呢?没有使用这个对象之前, 就把它加载到了内存中去是一种巨大的浪费。 针对这种情况,我们可以对以上的代码进行改进, 使用一种新的设计思想——延迟加载( Lazy-load )。 1. final class 2. { 3. = null; 4. 5. () { 6.} 7. 8. () { 9.if( null == ) = new (); 10. ; 11.} 12. }这种写法就是所谓的懒汉模式。 它使用了延迟加载来保证对象在没有使用之前, 是不会进行初始化的。但是, 通常这个时候面试官又会提问新的问题来刁难一下。他会问: 这种写法线程安全吗?回答必然是:不安全。这是因为在多个线程可能同时运行到第九行,判断 为 null,于是同时进行了初始化。所以,这是面临的问题是如何使得这个代码线程安全?很简单,在那个方法前面加一个 就 OK 了。 1. final class 2. { 3. = null; 4. 5. () { 6.} 7.
























