论坛首页 Java企业应用论坛

关于JAVA单例模式

浏览 52250 次
精华帖 (1) :: 良好帖 (2) :: 新手帖 (7) :: 隐藏帖 (12)
作者 正文
   发表时间:2012-03-15  
java 5之后我们可以采用enum来做单例,public enum Singleton {
    INSTANCE
}
0 请登录后投票
   发表时间:2012-03-15   最后修改:2012-03-15
Fkron 写道
今天和一人讨论以下这几形式的单例,看这样写是否正确??
public class Singleton
{
    private static Singleton st;
    
    public static Singleton getInstance()
    {
        if (null == st)
        {
            return new Singleton();
        }
        return st;
    }
}



他说这样写不对。。晕了。。

没有构造函数啦
private Singleton(){}
0 请登录后投票
   发表时间:2012-03-15  
现在有Spring 了,一般很少写单例了吧。
0 请登录后投票
   发表时间:2012-03-15  
构造函数不私有化,这样写能有啥用
0 请登录后投票
   发表时间:2012-03-15  
私有的构造方法呢
0 请登录后投票
   发表时间:2012-03-15   最后修改:2012-03-15
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;
	}
}
1 请登录后投票
   发表时间:2012-03-15  
楼主的函数错误有3点:
1.没有synchronized,现实中一般是多线程环境。
2.st没有赋值。不关调用方法多少次,st==null。
3.构造函数没有私有化。
0 请登录后投票
   发表时间:2012-03-15  
楼上正解。
首先构造函数要私有化,否则别人可能不用你的getInstance()方法而是直接new一个对象,这样还是单例吗?
其次,多线程时要加锁,否则A线程看到是null,正在准备new对象,他正在要开始的时候B线程进来了,看到也是null,他也开始new对象,这样结果是A和B两个线程分别使用了两个不同的对象(都是自己new出来的),不同线程使用不同的对象也不是单例了。

解决办法是楼上的私有化构造函数并使用双重锁机制。
0 请登录后投票
   发表时间:2012-03-15  
//饿汉式
public class Singleton {

//将构造函数私有化
private Singleton(){

}

private static Singleton instance = new Singleton();

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




//懒汉式
public class Singleton1 {

private static Singleton1 instance = null;

public  static synchronized Singleton1 getInstance() {
if(instance == null){
instance = new Singleton1();
}
return instance;
}
}
0 请登录后投票
   发表时间:2012-03-15  
最近我们招初级程序员,好多写的这个

构造方法没有私有化 多线程安全问题没有考虑 甚至有的连方法都写成非静态的
0 请登录后投票
论坛首页 Java企业应用版

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