锁定老帖子 主题:关于java单例模式双重检测
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (2)
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-28
愿得volatile详解,我还是第一次看到,刚在网上查了一下,引用它大概是:
volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会 |
|
返回顶楼 | |
发表时间:2010-04-28
关于这个不可靠,原文最后集中在了return语句是否能保持原子性?
5452 写道 双重检查是不可靠的,所以最好还是用哪个所谓的饱汉模式,就是先在类内部new一个private对象,然后将类的构造函数设为private,用一个public的方法返回那个对象。
|
|
返回顶楼 | |
发表时间:2010-04-28
我这里用的是jdk1.6,jdk1.4那个问题应该不会出现
yunghe 写道 没问题,volatile的语义保证了以volatile声明过的变量不会参与指令的重排序。
但好像只有jdk1.4以后的JMM才保证了volatile重排序问题,所以最好还是采用内部类的方式来初始化。 |
|
返回顶楼 | |
发表时间:2010-04-29
fengsky491 写道 我这里用的是jdk1.6,jdk1.4那个问题应该不会出现
yunghe 写道 没问题,volatile的语义保证了以volatile声明过的变量不会参与指令的重排序。
但好像只有jdk1.4以后的JMM才保证了volatile重排序问题,所以最好还是采用内部类的方式来初始化。 同意观点 其实加上了synchronized语义上保证了同一时刻只有一个线程执行new操作,那么何来所谓的instance已经有了还new!除非synchronized的语义被破坏了 这样的问题太无聊了 |
|
返回顶楼 | |
发表时间:2010-04-29
补充一下,可能有人说因为instance没有设置为volidate所以此情况存在!
实际上当synchronized块内部用到的变量 语义上是不会出现幻读的,他们永远都是当前内存值 |
|
返回顶楼 | |
发表时间:2010-04-29
robyjeffding 写道 愿得volatile详解,我还是第一次看到,刚在网上查了一下,引用它大概是:
volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会 在java 并发编程实践这本书上有解释。。可以去看看。大概意思好像是说有volatile 修饰的变量不会在线程的工作内存中存在拷贝,只在主存中有,而且也保证了读写的顺序。具体我也忘了。。呵呵。。 |
|
返回顶楼 | |