论坛首页 Java企业应用论坛

DAO和Service使用单例 模式是否会有同步问题

浏览 8060 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-02-13  
DAO
如:
public class SecurityService {
   private UserDao userDao;
   private DeptDao deptDao;
}

service在action中被调用。
在Spring的配置中,Bean默认是单例的,我也看到很多例子都是使用的默认配置,但是在Web应用中不会产生同步问题吗?
   发表时间:2005-02-13  
那你先说说为什么会有同步问题?
0 请登录后投票
   发表时间:2005-02-13  
实际上是我对多线程一直没有理解清楚的缘故。以下是我的理解,请指正:
我知道在Action中不能持有实例变量的,因为Struts对每个ActionClass只会实例化一个,当多个客户端访问Action时可能会同时访问持有的实例变量造成同步问题,如果Service是单例或持有的Dao是单例的话,Service肯定是在访问公共资源的,那也可能被多个客户端同时访问一个实例引起同步问题吧?
PS:我曾试图把Action交于Spring管理,使用"Singleton=false"处理,但是好象就不能使用OpenSessionInView了,不知那位碰到过这样的情况。
0 请登录后投票
   发表时间:2005-02-13  
引用
当多个客户端访问Action时可能会同时访问持有的实例变量造成同步问题


如果你持有的实例变量是immutable的,为什么会有同步问题?
0 请登录后投票
   发表时间:2005-02-13  
同步问题出现在某一个线程所对应的对象实例(如某servlet的实例)需同时为多个用户服务,同时,该实例中却有对某特定用户所特有的property(如该servlet实例中包含某user对象),这样当为某用户服务时,把特定的property付给了该对象,当VM让该实例为别的用户服务时,就出现了该实例的的property(如该servlet包含的user对象)不正确的状况。
0 请登录后投票
   发表时间:2005-02-14  
哦,也就是说,对于我举的例子来说,由于service对象及其持有的dao对象都是immutable的,并且,对于不同客户端的调用,service的方法工作在不同的执行栈中,因此全部使用singleton是不会有同步问题的。是这样吧?
0 请登录后投票
   发表时间:2005-02-17  
对同一个对象,如果同时有两个线程调用这个对象的同一个方法,那么jvm会自动开两个栈用以存储这个方法内部的变量,所以没有同步问题
0 请登录后投票
论坛首页 Java企业应用版

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