首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

[40分:结贴超快]singleton模式同步锁有关问题

2012-10-08 
[40分:结贴超快]singleton模式同步锁问题double-check locking:第一种方式:Java codepublic class Singlet

[40分:结贴超快]singleton模式同步锁问题

double-check locking:
第一种方式:

Java code
public class Singleton {    private static Singleton instance = null;    private Singleton(){}    public static Singleton getInstance() {        if (instance == null){            synchronized(Singleton.class){                if(instance == null) {                     instance = new Singleton();                }            }        }        return instance;    }}


第二种方式:
Java code
public class Singleton {    private static Singleton instance = null;    private static final Object object = new Object();    private Singleton(){}    public static Singleton getInstance() {        if (instance == null){            synchronized(object){                if(instance == null) {                     instance = new Singleton();                }            }        }        return instance;    }}


三:另外的实现方式:

2>下面的这种方式呢?
Java code
public class Singleton {     private static Singleton instance = new Singleton();     private Singleton() {         // ....     }     public static Singleton getInstance() {         return instance;     }     // 其它实作 }


3>另外这种方式?
Java code
public class Singleton {    private static class SingletonHolder {        static final Singleton instance = new Singleton();    }    public static Singleton getInstance() {        return SingletonHolder.instance;    }}


问题1:

1>请问第一种方式和第二种方式有什么区别?
  性能方面呢?

2>另外的方式有什么区别?
  性能?安全性?


[解决办法]
前2种有区别么?都是延迟初始化,用双重锁检查。
一个object 一个Singleton.class。 jdk1.5以前别用这种模式,会出问题的。就是1.5以后也要用volatile fix一下(private static volatile Singleton instance = null)

后面2种有区别么?只是写法不一样罢了,都是预先初始化。这种方式没有问题,哪都能用。
[解决办法]
我比较喜欢使用最后一种方式,也就是你所说的“另外的一种方式”。前两种原理是一样的,基本没什么区别
第三中很显然不能解决并发的问题,如果不需要并发处理,建议使用第三种,因为性能上有保障啊。如果既要考虑并发又要考虑性能,则选择最后一种方式

热点排行