注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

王金龙 廊坊师范学院信息技术提高班十二期

习惯决定性格,性格决定命运!

 
 
 

日志

 
 

【并发编程】——线程安全-脏读  

2018-04-29 22:06:41|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
脏读
【并发编程】——线程安全-脏读 - 12期 王金龙 - 王金龙 廊坊师范学院信息技术提高班十二期

demo:

new一个DirtyRead dr这个实例对象,启动执行t1线程时去调用这个dr对象的setValue方法设定值,t1初始化完



主线程,

t1调用setValuue,需等待2s

主线程在sleep1s中时,直接调用了getValue(),

综上:线程t1需要设值,2s,在这2s中内,又有一个线程直接进行取值,那么打印结果就会如下:

 
【并发编程】——线程安全-脏读 - 12期 王金龙 - 王金龙 廊坊师范学院信息技术提高班十二期

 考虑问题的整体性:在setValue()的时候不想让其他线程进行getValue()操作。两个方法上都加上synchronized2s设值完后再执行主线程的getValue()。完整的过程。
【并发编程】——线程安全-脏读 - 12期 王金龙 - 王金龙 廊坊师范学院信息技术提高班十二期

面试:

问题补充:数据库ACID的含义和经典例子

问题描述:关系型数据库,数据量很大,一千万条数据,ClientA9:00查数据,假设是最下边那一条吧。使用fullscan,抛开索引不考虑。那么需要10分钟,9:10时查到,但是ClientB9:05时发送DML语句(uid),把查的那条数据修改了。从100200,问,最后查到的结果是100还是200

 
【并发编程】——线程安全-脏读 - 12期 王金龙 - 王金龙 廊坊师范学院信息技术提高班十二期


问题解答:最终一定是100

oracle一致性读的概念:在9:00那一刻看到的数据,之后进行的操作也是9:00那一刻的数据,只可能是100,不能看到200。为什么不能是200oracleundo的概念。客户端执行DML时,会先把原来的老值放到undo中。9:05100放到undo中,再对200放过去修改,commit时没有错误就可以正确提交。但是undo就是为了防止update失败,失败的话就会回滚,回滚时需要从undo中把原先的老值100拿出来,rollback200。当发现值从100变成200发生变化时,oracle会从undo中找原先的老值100,如果能找到,那返回去的还是原来值100,如果找不到,就会抛个异常(snapshottooold快照太旧,可能也会有别的多个线程修改100),但肯定不会返回新值200

 
【并发编程】——线程安全-脏读 - 12期 王金龙 - 王金龙 廊坊师范学院信息技术提高班十二期
 mysql也有类似的。
  评论这张
 
阅读(1)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018