论坛首页 Java企业应用论坛

关于JAVA单例模式

浏览 52181 次
精华帖 (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之后的版本,如果解决了,书中就不会特意提这个问题了。
0 请登录后投票
   发表时间: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之后的版本,如果解决了,书中就不会特意提这个问题了。


《java concurrency in practice》这本书上提到了,这本书的作者niubility了吧,权威了吧

位置:16.2.4节最后一段第一句:
Subsequent changes in the JMM (Java 5.0 and later) have enabled DCL to work if resource is made volatile, and the performance impact of this is small since volatile reads are usually only slightly more expensive than nonvolatile reads. However, this is an idiom whose utility has largely passedthe forces that motivated it (slow uncontended synchronization, slow JVM startup) are no longer in play, making it less effective as an optimization. The lazy initialization holder idiom offers the same benefits and is easier to understand.


关于“如果解决了,书中就不会特意提这个问题了”,《java concurrency in practice》16.2.4节第一段第一句给出了答案:

No book on concurrency would be complete without a discussion of the infamous double-checked locking (DCL) antipattern



PS:《java与线程》尼玛那是用机器翻译出来的啊!似乎上面没敢写是谁翻译的吧。且这本书的含金量也实在不高

 

0 请登录后投票
   发表时间: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 你下面都有了而且 变量没有初始化 应该会报错的
0 请登录后投票
   发表时间:2012-03-16  
貌似没人提这个方案呢:
public class Singleton{
private static class Holder{
public static Singleton instance = new Singleton();
}

public static Singleton getInstance(){
return Holder.instance;
}

// 私有构造方法
}
0 请登录后投票
   发表时间:2012-03-16  
DCL问题在这个帖子已经非常清楚了
http://www.iteye.com/topic/260515
0 请登录后投票
   发表时间:2012-03-16  
一帮子super junior
0 请登录后投票
   发表时间: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();
0 请登录后投票
   发表时间: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)。
0 请登录后投票
   发表时间:2012-03-16  
@ThreadSafe
public class ResourceFactory {
     private static class ResourceHolder {
         public static Resource resource = new Resource();
     }

     public static Resource getResource() {
         return  ResourceHolder.resource ;
     }
}

现在都应该这样写了吧。。。
0 请登录后投票
   发表时间:2012-03-16  
大家都在讨论如何避免多线程的问题,那我再延伸一下,所有的这些能保证单例么?似乎所有的限制那反射都没有办法啊。。。
我当时新开了一个帖子,不过木有人回应。。。
http://www.iteye.com/topic/1121376
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics