日期:2014-05-17  浏览次数:20676 次

多个线程同时去一个表中取数据,如何控制同一条数据不被2个线程取到?
有多个线程同时在一张表中取数据,表中有个字段记录着该条数据是否已被取过,如果被取过就不再去取。
在并发的时候,如何防止不被2个线程同时取?
如果用synchronized时,那对该表的访问是不是只能是单线程了?

------解决方案--------------------
存与取貌似都只能单线程吧,还是坐等大牛解释一下
------解决方案--------------------
如果不需要修改写入没必要同步吧,不是很理解楼主的问题!
synchronized作用是在某一时刻只允许一个线程访问同步方法或块。并非就是单线程了!
------解决方案--------------------
◎ 在并发的时候,如何防止不被2个线程同时取?
—— 基本上主要靠在数据库端做手脚,否则集群环境下无法保证。
—— 做法基本上是捆绑两句话在一个事务中,第一句Select...For Update,第二句修改作为标志的字段。

◎ 如果用synchronized时,那对该表的访问是不是只能是单线程了?
—— 不能说是单线程,应该说是串行化访问。Select .... For Update 也可以实现类似于串行化访问的效果。
------解决方案--------------------
只取不改貌似不用做事务了吧。。

要是一定要加锁 那就悲观或者乐观锁吧
------解决方案--------------------
我觉得应该是给表字段加锁,乐观悲观你需要自己斟酌