关於线程面试问题问题 ----=-急

一个关于多线程无故出现线程死掉的问题
[问题点数:50分,结帖人crystal_lz]
一个关于多线程无故出现线程死掉的问题
[问题点数:50分,结帖人crystal_lz]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年4月 总版技术专家分月排行榜第一2013年3月 总版技术专家分月排行榜第一
2013年4月 .NET技术大版内专家分月排行榜第一2013年3月 .NET技术大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。求javaweb大神戳入,前段时间做的一个项目,关于线程问题~ - 开源中国社区
当前访客身份:游客 [
当前位置:
tomcat是个多线程的服务器,假设两个用户同时发出请求,那么tomcat就会开辟两条线程分别进行,但是当两个用户几乎同时请求访问同一片代码块(即发出同一个请求)的时候就会出现所谓的“并发”现象,目前为止我理解的对吗?求指导!
回到正题:以上是我遇到的一些疑惑,我前一段时间做了一个近似传销模式的直销系统,采用了很多逆向递归和正向递归方法计算奖金,ok,假设现在有两个用户访问同时点击了同一个按钮,且触发该按钮后就会进行一环扣一环的“逆向递归运算”,其中还会进行一些数据库的操作,抛去所有运算步骤不说,单说tomcat从“线程池”中分配给这两个用户的线程来讲,会不会相互影响?
如果上述不是很清晰,那我就举个项目中的例子:
User user=this.userDao.getUserObj(id);
int i=user.getIsnet();//isnet是字段,有0或1两种情况,默认为0
//如果是1就不进行任何操作
....//如果等于0这里进行逻辑处理
user.setIsnet(1);//如果字段为0就修改为1
this.userDao.update(user);//注意这里已经修改
如上述代码是递归函数中的一部分,现在两个用户同时进行此操作,假设线程1先到(线程2紧随其后),显然线程1先进行了“else”部分,将字段“isnet”修改为1,那么线程2利用的还是栈区的数据i,值依旧为0,(注意这时候线程1已经对数据库进行操作修改了字段值),线程2显然会多执行一次“else”部分,尼玛,这样不就被坑惨了?还有如果线程同步的话是否会避免这种问题,说说我理解的线程同步吧,如果线程1正在运行这个函数(假设该函数已经加锁),那么线程2必须得等待线程1执行完才能执行线程2,这时候显然避免了上述情况,但是这样在“大并发量”的情况下显然效率低的一B,
先感谢各位前辈们耐心读完以上的内容,我还在读大学,看到线程这里懵逼了,在加上刚刚做了一个有大量递归处理的项目,现在想想有点小后怕,不过好在项目访问量不是很大,不过也不排除以上的“并发”情况
真的很感谢您耐心读完,跪求指导啊!
共有3个答案
<span class="a_vote_num" id="a_vote_num_
1.两个用户的ID是一样的?怎么会有这种情况?如果ID不一样,那喝咖啡去吧,啥事都没有
2. 最简单的做法,线程同步,其实再怎么并发都不会有问题,除非你这里的update操作要花很少时间
3. 在update里加上一个条件 update user set is_net = 0 where id = id and is_net = 0&
--- 共有 2 条评论 ---
: 这个和事务无关,事务解决的是要么同时失败,要么同时成功的问题
(1年前)&nbsp&
所谓的事务是不是解决这种并发访问数据库的问题的?可是在并发情况下用户2得在用户1的事务完成后才能进入操作,这样在大并发的情况下会影响效率吗?求解答啊大神!
(1年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
厄,问题的代码部分,考虑的太复杂了···
完全可以通过执行&
至于并发的问题,如果非要考虑的话,可以考虑线程同步,关于效率影响的话,写测试代码,开N个线程测试一下,效率不会差的·
仅供参考。
<span class="a_vote_num" id="a_vote_num_
可以看看乐观锁和悲观锁,除非你的事务耗时很久,不然lock数据,效率影响不大的,并发一般不会有那么高的。
更多开发者职位上
有什么技术问题吗?
上帝爱众生的其它问题
类似的话题    今天工作遇到一个难缠的bug,浪费了2个小时终于解决。
&&&&&&&&&& 问题描述:对资源的管理中用到关键字查询以及分页查询。视图控制器用到struts2,数据存储用spring的data-mongodb来存储数据以及查询数据。但是发现一个问题,在用分页查询时能查询出所有记录,然后用关键字查询获取查询内容后,在用分页查询但是只能获取关键查询的数据,其他数据死活查询不出来。开始我以为是自己前端有逻辑问题,但是我用其他的浏览器操作同样出问题。因此知道问题出在后台代码。开始以为是不是数据有缓存,但是其他模块也这样实现没问题,纠结了半天,最后我对比了其他模块在struts.xml配置中差异,发现其他模块的action中spring配置有scope=''propotype",但是又想如果是线程安全问题,也不应该是因为action,给数据有关应该是service层或是dao层,但是还是这样尝试修改一下,奇迹出现了,问题解决了。开始我以为struts2是线程安全的他通过过滤每次请求都会实例化,交给spring管理应该默认都是propotype.所以我思考问题所在。最后终于明白了。
&&&& bug原因:由于sttruts2交个spring管理默认是单件模式,所以就创建一次对象,这样就有线程安全问题,其他请求访问时,由于关键查询,key一直存在值,所以在回到分页查询其实执行的还是关键字查询,这就造成了以上问题,是个典型的线程安全问题。
  技术总结:
Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。 Spring的Ioc容器管理的bean默认是单实例的,上一次请求处理的状态信息被保持下来,并影响了下一次的请求,实际上就是Action中的类变量被不同的请求读取,出现错误结果
解决:就是不用单例, spring中bean的作用域设为prototype,每个请求对应一个实例.
阅读(...) 评论()同一个线程函数启动多次,为什么会出有关问题呢?求解 - C++当前位置:& &&&同一个线程函数启动多次,为什么会出有关问题呢?求同一个线程函数启动多次,为什么会出有关问题呢?求解&&网友分享于:&&浏览:84次同一个线程函数启动多次,为什么会出问题呢?求解!DWORD WINAPI processQueue(LPVOID lp){ int *p=(int *) printf(&i is %d\n&, *p)); return 0;}int main(int argc, char* argv[]){ HANDLE thread[10];
DWORD dw[10]; int nArr[10] = {0,1,2,3,4,5,6,7,8,9}; thread[0]=CreateThread(NULL,0,processQueue,&nArr[0],0,&dw[0]); thread[1]=CreateThread(NULL,0,processQueue,&nArr[1],0,&dw[1]); thread[2]=CreateThread(NULL,0,processQueue,&nArr[2],0,&dw[2]); thread[3]=CreateThread(NULL,0,processQueue,&nArr[3],0,&dw[3]); thread[4]=CreateThread(NULL,0,processQueue,&nArr[4],0,&dw[4]); thread[5]=CreateThread(NULL,0,processQueue,&nArr[5],0,&dw[5]); thread[6]=CreateThread(NULL,0,processQueue,&nArr[6],0,&dw[6]); thread[7]=CreateThread(NULL,0,processQueue,&nArr[7],0,&dw[7]); thread[8]=CreateThread(NULL,0,processQueue,&nArr[8],0,&dw[8]); thread[9]=CreateThread(NULL,0,processQueue,&nArr[9],0,&dw[9]);
WaitForMultipleObjects(10,thread,TRUE,1000);
CloseHandle(thread); return 0;}定义一个线程函数processQueue,在main函数中创建10次线程,分别传进不同的参数,然后在线程函数中打印传进的参数,为什么会出现下面的问题,有些值打印了多次,但是10个数都打印出来了。难道线程执行了不止10次吗?i is 0i is 1i is 2i is 3i is 3i is 4i is 6i is 5i is 5i is 8i is 7i is 9个人认为线程中的局部变量应该是公用的,但是参数lp也是公用的吗?请高手解答!------解决方案--------------------俺不知道有啥问题,学习了.
------解决方案--------------------线程的局部变量不是公用的每个线程有自己的线程栈lz的代码在我这run很好,10个都打印了,而且无重复
------解决方案--------------------线程执行优先级问题。同一级别的线程执行时的次序是随机的,而这个随机性很大程度上和你用的编译器有关。可能有的线程还没有等到执行主函数就退出了,而有的则执行了两次以上。
------解决方案--------------------10个数输出的顺序有差异,这个我明白,但是从楼主的代码来看,输出两个相同的数,我就不能理解了。坐等高手解答
------解决方案--------------------只要不存在在共享资源,那就不存在问题吧,它们是不同的。
------解决方案--------------------LZ有没有把动态链接库改成MTD?MTD的话printf就是线程安全的了。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有}

我要回帖

更多关于 线程面试问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信