论坛首页 Java版 Spring

如何判定什么时候需要同步.

浏览 5175 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2006-01-06
spring的controller一般都是单件方式运行,请问什么情况下需要同步,多线程下如何确定哪些操作是线程安全的.例如
[code:1]
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String cmd=request.getParameter("cmd");
//这里cmd会不会因为,多线程下,线程A是insert,线程b是delete,会不会因为,线程A取到,信息后cmd后在比较前,被线程B给替换成delete呢?而错误执行delete
if (cmd.equals("insert"))
dao.doInsert(); //dao中操作很多是数据库操作很费时间要设置同步吗?不设置同步如何确保不会被多线程影响?
else if (cmd.equals("delete"))
dao.doDelete();


}
[/code:1]
另外dao这样业务实例一般是单件模式,还是普通方式呢?
什么情况下controller会出现同步问题,如何判定哪些操作需要同步,怎样写线程安全的控制器,有没有好的参考?
   
时间:2006-01-06
这里面的cmd是从request里面取出来的呀,可跟单例一点关系都没有,请仔细斟酌。。。。

dao一般都是单例的。
   
0 请登录后投票
时间:2006-01-06
差沙 写道
这里面的cmd是从request里面取出来的呀,可跟单例一点关系都没有,请仔细斟酌。。。。

dao一般都是单例的。

那cmd会不会在equals之前,因为另外一个线程也在getParameter而改变值呢?
   
0 请登录后投票
时间:2006-01-06
request是不同的。。。。。
   
0 请登录后投票
时间:2006-01-06
差沙 写道
request是不同的。。。。。

什么情况要同步呢?怎么判定哪些需要做同步处理.
在spring中代码中有的地方有同步,有的地方没有,我们自己程序应该已什么准则判断是否有问题呢.有没有这方面的资料?
   
0 请登录后投票
时间:2006-01-06
makefile 写道
差沙 写道
request是不同的。。。。。

什么情况要同步呢?怎么判定哪些需要做同步处理.
在spring中代码中有的地方有同步,有的地方没有,我们自己程序应该已什么准则判断是否有问题呢.有没有这方面的资料?

有内部状态的对象需要同步,没有内部状态就不需要。实际上对于有内部状态的对象,通常也不去同步,而是针对每个请求新建一个。(spring的prototype方式。)
   
0 请登录后投票
时间:2006-01-06
gigix 写道
有内部状态的对象需要同步,没有内部状态就不需要。实际上对于有内部状态的对象,通常也不去同步,而是针对每个请求新建一个。(spring的prototype方式。)


大牛出现,赶紧问点问题~~

是不是这样几个情况需要严重地注意是否同步:

1、singleton的对象
2、static变量


其它的暂时想不出来叻。。。
   
0 请登录后投票
时间:2006-01-06
hongliang 写道
gigix 写道
有内部状态的对象需要同步,没有内部状态就不需要。实际上对于有内部状态的对象,通常也不去同步,而是针对每个请求新建一个。(spring的prototype方式。)


大牛出现,赶紧问点问题~~

是不是这样几个情况需要严重地注意是否同步:

1、singleton的对象
2、static变量


其它的暂时想不出来叻。。。
   
0 请登录后投票
时间:2006-01-06
gigix 写道
makefile 写道
差沙 写道
request是不同的。。。。。

什么情况要同步呢?怎么判定哪些需要做同步处理.
在spring中代码中有的地方有同步,有的地方没有,我们自己程序应该已什么准则判断是否有问题呢.有没有这方面的资料?

有内部状态的对象需要同步,没有内部状态就不需要。实际上对于有内部状态的对象,通常也不去同步,而是针对每个请求新建一个。(spring的prototype方式。)

例如下面函数:能说下需要同步吗?为什么?
public static String byte2hex(byte[] b) {
String hs = "";
String stmp = "";

for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
if (n < b.length - 1)
hs = hs + ":";
}
return hs.toUpperCase();
}
   
0 请登录后投票
时间:2006-01-06
gigix 写道
有内部状态的对象需要同步,没有内部状态就不需要。


啊,被bs叻。。。
   
0 请登录后投票
论坛首页 Java版 Spring

跳转论坛: