浏览 2390 次
锁定老帖子 主题:我理解的单件模式
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-13
public class Singleton{ //volatile 仅仅在JDK5+有效,跟同步块synchronized一起使用,可提高同步性能。如果读操作远远超过写操作,可以结合使用内部锁和 volatile 变量来减少公共代码路径的开销 private volatile static Singleton test; private Singleton(){} public static Singleton getInstance(){ if(test == null){ synchronized(Singleton.class){ if(test==null){ test = new Singleton(); } } } return test; } } 注意: 1.单件必须保证使用同一个类加载器 2. jdk1.2中的单件在无引用的情况下会被垃圾回收 3. 单件类中必须使用静态变量,因为方法是静态的,而且方法必须是静态的 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-08-14
public static synchronized Singleton getInstance(){
return test==null?(new Singleton()):test; } 我是个新手,请问这样把synchronized 放在这个方法体上和那样有什么区别呢 |
|
返回顶楼 | |
发表时间:2009-08-14
最后修改:2009-08-14
引用 public static synchronized Singleton getInstance(){
return test==null?(new Singleton()):test; } 我是个新手,请问这样把synchronized 放在这个方法体上和那样有什么区别呢 这个例子来看没有区别,都是对getInstance()加锁 并且 引用 if(test == null){
synchronized(Singleton.class){ if(test==null){ test = new Singleton(); } } } 这种写法真的是莫明其妙的感觉 P.S. volatile在JDK1.2就有了,何来只在JDK 5有效一说? the modifier volatile is included for some of the member variables. By indicating that a member variable is volatile, you inform the JavaVM that its value might be changed by one thread while being used by another. |
|
返回顶楼 | |
发表时间:2009-08-14
推荐看看这篇文章《双重检查锁定及单例模式》:
http://www.ibm.com/developerworks/cn/java/j-dcl.html 线程安全的单例模式 public class Singleton{ private static Singleton instance = new Singleton(); private Singleton(){ } public static Singleton getInstance(){ return instance; } } |
|
返回顶楼 | |
发表时间:2009-08-14
有很大区别,做JVM有很多公司有很多,这其中有不少JVM是不支持volatile的(在JDK5之前),会导致双重枷锁失效,建议你听听你楼下的那位朋友的说法。
这种写法不是莫名其妙,好好研究~~ metaphy 写道 引用 public static synchronized Singleton getInstance(){
return test==null?(new Singleton()):test; } 我是个新手,请问这样把synchronized 放在这个方法体上和那样有什么区别呢 这个例子来看没有区别,都是对getInstance()加锁 并且 引用 if(test == null){
synchronized(Singleton.class){ if(test==null){ test = new Singleton(); } } } 这种写法真的是莫明其妙的感觉 P.S. volatile在JDK1.2就有了,何来只在JDK 5有效一说? the modifier volatile is included for some of the member variables. By indicating that a member variable is volatile, you inform the JavaVM that its value might be changed by one thread while being used by another. |
|
返回顶楼 | |
发表时间:2009-08-14
有很大区别的,放在方法提上会让影响效率的,一个synchronized锁会让一个方法调用的效率降低100倍,放在方法体上同步会让每次调用都要采取同步机制,放在里面那样写,只有第一次并发需要同步,以就不需要同步了。
01404421 写道 public static synchronized Singleton getInstance(){
return test==null?(new Singleton()):test; } 我是个新手,请问这样把synchronized 放在这个方法体上和那样有什么区别呢 |
|
返回顶楼 | |
发表时间:2009-08-14
这样写的一个缺点是把变量实例化的全新交给了系统,有时候就算不调用,也会实例化,还有,如果实例化后还需要很多操作,才算产生一个真正的实例,这样也是不行的。
nextway.cn 写道 推荐看看这篇文章《双重检查锁定及单例模式》:
http://www.ibm.com/developerworks/cn/java/j-dcl.html 线程安全的单例模式 public class Singleton{ private static Singleton instance = new Singleton(); private Singleton(){ } public static Singleton getInstance(){ return instance; } } |
|
返回顶楼 | |