|
该帖已经被评为新手帖
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2008-01-18
多线程的话需要将方法都改成静态的?
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-01-18
不是不能用于多线程。主要是有些写法在多线程下可能会出现问题。
比如 if(objcet == null) { objcet = new XXX(); } return objcet; 这样的代码,多线程下,可能会发生错误。所以这种写法只能在单线程下使用。这种写法虽然可以用同步锁,如果用同步锁保护,会造成性能低下。Web开发中很多框架都在使用单例。所谓不能在多线程下使用主要是指上面的写法。这种写法无论静态动态都不能用。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-01-18
如果是这样的话,多线程下是否会有问题?
public staticSingletonInstance() { if (_instance == null) { synchronized (Class.forName("Singleton")) { if (_instance == null) { _instance = new Singleton(); } } return _instance; } |
|
| 返回顶楼 | |
|
最后更新时间:2008-01-18
这种写法的产生同步问题的点在if判断上。如果同时两个线程访问这个单例,一个发现为空,开始建立对象。但是同时在没有建立完的时候,又一个线程进来了,因为没有建立完,所以也判断为空。又建立了一个。单例失败。
你这种你只能测试来判断。我还是头一次看见用两个if语句的单例。不过现在自己写单例没什么必要了,IOC框架都支持建立单例。所以还是用IOC框架吧。如果不用IOC的话,还是推荐在类加载的时候建立对象比较好。绝对安全。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-01-18
用了Singleton模式的类除了在实例化的问题上多线程使用的时候可能会出问题,实例化以后在多线程中是安全的?
|
|
| 返回顶楼 | |
|
最后更新时间:2008-01-18
基本上来说是安全的。比如Struts的Action都是单例。不过事无绝对。很多时候多线程问题是很难找到的。因为多线程问题的发生很多时候有偶发性。也许很久都不发生,也许随时会发生。你就是加了同步还有可能死锁呢。所以咱们小老百姓最好还是把单例的生成、调用这些东西给容器管理好了。由那些大拿们操心吧。咱们多关注些业务,买米养活自己才是正路。如果有业余时间,可以看看Spring等IOC的源代码,看看人家是怎么写的。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-01-18
的确很容易出问题.如果是一个构造时间长的复杂对象,第一次创建时是容易出问题的。
可以考虑在系统初始化的时候加载。 这是"条件优先原则" O'Reilly java network programming那本书里有更多介绍。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-01-18
前提是存在实例变量。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-01-18
Singleton的多线程版本为Double-Checked Locking模式,可以去参考下!
|
|
| 返回顶楼 | |
|
最后更新时间:2008-06-12
我刚讨论过这个问题,得出结论是这样得,一般只读得对象才适合单例模式,单例对象不应该保留状态,这样就没有并发问题,也不必加锁,如果真是想保留状态可以考虑threadlocal,但是一般会改变得对象不适宜单例模式。
|
|
| 返回顶楼 | |






