锁定老帖子 主题:关于JAVA单例模式
精华帖 (1) :: 良好帖 (2) :: 新手帖 (7) :: 隐藏帖 (12)
|
|
---|---|
作者 | 正文 |
发表时间:2012-03-16
ol_beta 写道 freish 写道 zxmzfbdc 写道 双重检查锁定和双重检查成例,在java中并不能起作用,详情可参看《java与线程》一书。
jdk1.5后,使用volatile已经木有问题了 http://freish.iteye.com/blog/1008304 double lock checking 在jdk4以后就解决了,可以说是个bug 这个倒从来没有听说过,《java与线程》一书,是在jdk5之后的版本,如果解决了,书中就不会特意提这个问题了。 |
|
返回顶楼 | |
发表时间:2012-03-16
最后修改:2012-03-16
zxmzfbdc 写道
ol_beta 写道
freish 写道
zxmzfbdc 写道
双重检查锁定和双重检查成例,在java中并不能起作用,详情可参看《java与线程》一书。
jdk1.5后,使用volatile已经木有问题了 http://freish.iteye.com/blog/1008304 double lock checking 在jdk4以后就解决了,可以说是个bug 这个倒从来没有听说过,《java与线程》一书,是在jdk5之后的版本,如果解决了,书中就不会特意提这个问题了。
No book on concurrency would be complete without a discussion of the infamous double-checked locking (DCL) antipattern
|
|
返回顶楼 | |
发表时间:2012-03-16
837062099 写道 coollzh 写道 考虑lazy load的话,可以用double check技术。
不过double check有时候也不是100%线程安全的 多线程情况下,直接在方法上加synchronized同步,但是不够效率,事实上,只需要同步一次就可以了。 double check + volatile就100%安全了,取消编译器优化。 public class Singleton { private static volatile Singleton st; private Singleton (){} public static Singleton getInstance() { if (null == st) { synchronized (Singleton.class) { if (st == null) { st = new Singleton(); return st; } } } return st; } } st new 了过后 这里不需要return 你下面都有了而且 变量没有初始化 应该会报错的 |
|
返回顶楼 | |
发表时间:2012-03-16
貌似没人提这个方案呢:
public class Singleton{ private static class Holder{ public static Singleton instance = new Singleton(); } public static Singleton getInstance(){ return Holder.instance; } // 私有构造方法 } |
|
返回顶楼 | |
发表时间:2012-03-16
DCL问题在这个帖子已经非常清楚了
http://www.iteye.com/topic/260515 |
|
返回顶楼 | |
发表时间:2012-03-16
一帮子super junior
|
|
返回顶楼 | |
发表时间:2012-03-16
取之于网络 用之于网络
class A{ private A(){} private static Inner{ private static A a = new A(); private Inner(){} } public static A getInstance(){ return Inner.a; } } //client 调用 A a = A.getInstance(); |
|
返回顶楼 | |
发表时间:2012-03-16
一个简简单单的singleton经常看到引来很多争论。
只要类里面没得其它的static属性或方法,基本不需要考虑lazy load和thread safe,因为java字节码本来就是延时加载的,下面实现就行了。 public class Singleton { public static final Singleton so = new Singleton(); private Singleton(){} } 或者 public class Singleton { private static Singleton so = new Singleton(); private Singleton(){} public static Singleton getInstance {return so;} } 如果class Singleton里面有其它static属性或方法(这种情况几乎没有或者可以避免),这才考虑需不需要延时加载singleton对象,如果这些情况你都遇上了又确实不能忍受提前实例化。那就用holder class或double check(可以参考effective java(2e)中的item 71)。 |
|
返回顶楼 | |
发表时间:2012-03-16
@ThreadSafe public class ResourceFactory { private static class ResourceHolder { public static Resource resource = new Resource(); } public static Resource getResource() { return ResourceHolder.resource ; } } 现在都应该这样写了吧。。。 |
|
返回顶楼 | |
发表时间:2012-03-16
大家都在讨论如何避免多线程的问题,那我再延伸一下,所有的这些能保证单例么?似乎所有的限制那反射都没有办法啊。。。
我当时新开了一个帖子,不过木有人回应。。。 http://www.iteye.com/topic/1121376 |
|
返回顶楼 | |