锁定老帖子 主题:关于线程和实例的疑问
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-12-09
public class A implements Serializable { private final static ThreadLocal singlePerThread=new ThreadLocal();; public static A getInstance(); { A fact = (A); singlePerThread.get();; if(face == null); { face = createobj();; //创建第一个实例 singlePerThread.set(fact);; } return fact; } } 请问,在上面这段代码中,getInstance方法是所有线程共享一个实例,还是说为每一个线程赋予了一个实例? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-12-09
如果createObj()是直接new出一个对象,那么是每个线程一个实例。
|
|
返回顶楼 | |
发表时间:2004-12-09
是的,是执行了一次newInstance。
那么也就是说,每一个访问这个类的线程都有一个唯一的实例了。 请问,这样做,还算不算是单例模式? 单例模式指的是不是无论有多少个其他线程来访问它,也只共享一个实例? |
|
返回顶楼 | |
发表时间:2004-12-09
还请问一点,Servlet所实现的 “单实例,多线程” 和上面这段代码所表述的含义一致么?
|
|
返回顶楼 | |
发表时间:2004-12-09
这个是Threadlocal模式,和singleton不一样,singleton是说在整个应用程序中保证只有一个实例,而Threadlocal是指每线程有唯一实例。Servlet的 “单实例,多线程”是指多个线程共享一个实例,因此会有同步的问题
|
|
返回顶楼 | |
发表时间:2004-12-09
谢谢你的回复,那一般说的静态工厂模式,是单例模式,还是ThreadLocal模式还是Servlet模式,抑或是其他模式?
单例模式是整个应用共享一个实例,是不是也会有Servlet那种线程同步并发的问题? |
|
返回顶楼 | |
发表时间:2004-12-10
静态工厂模式就是把工厂作为一个单例使用的,是单例模式
|
|
返回顶楼 | |
发表时间:2004-12-10
flyromza 写道 谢谢你的回复,那一般说的静态工厂模式,是单例模式,还是ThreadLocal模式还是Servlet模式,抑或是其他模式?
单例模式是整个应用共享一个实例,是不是也会有Servlet那种线程同步并发的问题? 单例模式通常是不会出现同步问题的,只要你保证getInstance方法是同步的就没问题,不过这样性能上会有损失 |
|
返回顶楼 | |
发表时间:2004-12-10
yhc0125 写道 flyromza 写道 谢谢你的回复,那一般说的静态工厂模式,是单例模式,还是ThreadLocal模式还是Servlet模式,抑或是其他模式?
单例模式是整个应用共享一个实例,是不是也会有Servlet那种线程同步并发的问题? 单例模式通常是不会出现同步问题的,只要你保证getInstance方法是同步的就没问题,不过这样性能上会有损失 “单例模式通常是不会出现同步问题的” 这句话怎么讲? 如果singleton返回的“缓存”对象是具有状态的。多处同时引用这同一个对象,那怎么会不出现“同步”问题呢? |
|
返回顶楼 | |
发表时间:2004-12-10
yhc0125 写道 静态工厂模式就是把工厂作为一个单例使用的,是单例模式
这句话也有问题,静态工厂模式中,这里的工厂是一个“singleton”,但是工厂所返回的对象未必是singleton。 |
|
返回顶楼 | |