我理解的单件模式
性能、安全最好的单件书写模式
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. 单件类中必须使用静态变量,因为方法是静态的,而且方法必须是静态的 1 楼 01404421 2009-08-14 public static synchronized Singleton getInstance(){
return test==null?(new Singleton()):test;
}
我是个新手,请问这样把synchronized 放在这个方法体上和那样有什么区别呢 2 楼 metaphy 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. 3 楼 nextway.cn 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;
}
}
4 楼 xiaoqulai 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.
5 楼 xiaoqulai 2009-08-14 有很大区别的,放在方法提上会让影响效率的,一个synchronized锁会让一个方法调用的效率降低100倍,放在方法体上同步会让每次调用都要采取同步机制,放在里面那样写,只有第一次并发需要同步,以就不需要同步了。
01404421 写道public static synchronized Singleton getInstance(){
return test==null?(new Singleton()):test;
}
我是个新手,请问这样把synchronized 放在这个方法体上和那样有什么区别呢
6 楼 xiaoqulai 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;
}
}