关于线程安全的思路问题

kangojian 2011-02-23 06:09:02
比方说有四个线程 访问同一条数据并且对它更新
有可能会出现四个线程的数据累计更新到一条数据上

好像在程序流程上各个环节都可能出现 问题

如下假设

1如果同步容器,确实能防止其他线程同是访问此数据 但是也不能避免 累计更新的情况
2如果在更新前作判断,如过有几个线程同时过了判断 结果还是会累计更新
。。。。。。。

问问大家有没有好的思路 和方法 最好不用锁 呵呵最好是基于 CAS原语


...全文
129 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
更新总归是先来后到吧,4 个线程同时更新,那最终采用谁的结果呢?
kangojian 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zqfddqr 的回复:]
不知道这样行不行
[/Quote]
不是行不行 的事 我只是想不出来 怎么能没有出现 重复写入的情况 当然不能用 同步锁 呵呵
zqfddqr 2011-02-23
  • 打赏
  • 举报
回复
不知道这样行不行
zqfddqr 2011-02-23
  • 打赏
  • 举报
回复
同步 加更新前检测

获得锁 检测 检测完就更新 在释放锁
kangojian 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shine333 的回复:]
乐观锁

数据库中加个字段,记录版本号。读数据的时候,记录下版本号,更新前,检查数据库里面的版本号和之前读取的是否一致。不一致的话,放弃此操作,并通知用户。

如果还不放心,那么在更新前读取数据库中最新版本号的时候,用Select for update。
[/Quote]

加一个字段管用吗
就算加了各自段 如果连个线程同时修改那个
理论步骤都是先读 那条数据 所以可能会出现两个线程都通过了判断条件的情况啊 这只是降低了概率 但不能避免啊






shine333 2011-02-23
  • 打赏
  • 举报
回复
漏了一点,update的时候,一并把版本号+1
shine333 2011-02-23
  • 打赏
  • 举报
回复
乐观锁

数据库中加个字段,记录版本号。读数据的时候,记录下版本号,更新前,检查数据库里面的版本号和之前读取的是否一致。不一致的话,放弃此操作,并通知用户。

如果还不放心,那么在更新前读取数据库中最新版本号的时候,用Select for update。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧