锁定老帖子 主题:关于JAVA单例模式
精华帖 (1) :: 良好帖 (2) :: 新手帖 (7) :: 隐藏帖 (12)
|
|
---|---|
作者 | 正文 |
发表时间:2012-03-15
java 5之后我们可以采用enum来做单例,public enum Singleton {
INSTANCE } |
|
返回顶楼 | |
发表时间: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(){} |
|
返回顶楼 | |
发表时间:2012-03-15
现在有Spring 了,一般很少写单例了吧。
|
|
返回顶楼 | |
发表时间:2012-03-15
构造函数不私有化,这样写能有啥用
|
|
返回顶楼 | |
发表时间:2012-03-15
私有的构造方法呢
|
|
返回顶楼 | |
发表时间: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; } } |
|
返回顶楼 | |
发表时间:2012-03-15
楼主的函数错误有3点:
1.没有synchronized,现实中一般是多线程环境。 2.st没有赋值。不关调用方法多少次,st==null。 3.构造函数没有私有化。 |
|
返回顶楼 | |
发表时间:2012-03-15
楼上正解。
首先构造函数要私有化,否则别人可能不用你的getInstance()方法而是直接new一个对象,这样还是单例吗? 其次,多线程时要加锁,否则A线程看到是null,正在准备new对象,他正在要开始的时候B线程进来了,看到也是null,他也开始new对象,这样结果是A和B两个线程分别使用了两个不同的对象(都是自己new出来的),不同线程使用不同的对象也不是单例了。 解决办法是楼上的私有化构造函数并使用双重锁机制。 |
|
返回顶楼 | |
发表时间: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; } } |
|
返回顶楼 | |
发表时间:2012-03-15
最近我们招初级程序员,好多写的这个
构造方法没有私有化 多线程安全问题没有考虑 甚至有的连方法都写成非静态的 |
|
返回顶楼 | |