|
锁定老贴子 主题:如何判定什么时候需要同步.
精华帖 (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会出现同步问题,如何判定哪些操作需要同步,怎样写线程安全的控制器,有没有好的参考? 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2006-01-06
这里面的cmd是从request里面取出来的呀,可跟单例一点关系都没有,请仔细斟酌。。。。
dao一般都是单例的。 |
|
| 返回顶楼 | |
|
时间:2006-01-06
差沙 写道 这里面的cmd是从request里面取出来的呀,可跟单例一点关系都没有,请仔细斟酌。。。。
dao一般都是单例的。 那cmd会不会在equals之前,因为另外一个线程也在getParameter而改变值呢? |
|
| 返回顶楼 | |
|
时间:2006-01-06
request是不同的。。。。。
|
|
| 返回顶楼 | |
|
时间:2006-01-06
差沙 写道 request是不同的。。。。。
什么情况要同步呢?怎么判定哪些需要做同步处理. 在spring中代码中有的地方有同步,有的地方没有,我们自己程序应该已什么准则判断是否有问题呢.有没有这方面的资料? |
|
| 返回顶楼 | |
|
时间:2006-01-06
makefile 写道 差沙 写道 request是不同的。。。。。
什么情况要同步呢?怎么判定哪些需要做同步处理. 在spring中代码中有的地方有同步,有的地方没有,我们自己程序应该已什么准则判断是否有问题呢.有没有这方面的资料? 有内部状态的对象需要同步,没有内部状态就不需要。实际上对于有内部状态的对象,通常也不去同步,而是针对每个请求新建一个。(spring的prototype方式。) |
|
| 返回顶楼 | |
|
时间:2006-01-06
gigix 写道 有内部状态的对象需要同步,没有内部状态就不需要。实际上对于有内部状态的对象,通常也不去同步,而是针对每个请求新建一个。(spring的prototype方式。)
大牛出现,赶紧问点问题~~ 是不是这样几个情况需要严重地注意是否同步: 1、singleton的对象 2、static变量 其它的暂时想不出来叻。。。 |
|
| 返回顶楼 | |
|
时间:2006-01-06
hongliang 写道 gigix 写道 有内部状态的对象需要同步,没有内部状态就不需要。实际上对于有内部状态的对象,通常也不去同步,而是针对每个请求新建一个。(spring的prototype方式。)
大牛出现,赶紧问点问题~~ 是不是这样几个情况需要严重地注意是否同步: 1、singleton的对象 2、static变量 其它的暂时想不出来叻。。。 |
|
| 返回顶楼 | |
|
时间: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(); } |
|
| 返回顶楼 | |
|
时间:2006-01-06
gigix 写道 有内部状态的对象需要同步,没有内部状态就不需要。
啊,被bs叻。。。 |
|
| 返回顶楼 | |








