CSDNRGY 2017-03-11 10:34 采纳率: 87.5%
浏览 1281
已采纳

没看懂这段解释加锁与可见性的话,哪位可以解释下?

4.1、加锁与可见性

  内置锁可以用于确保某个线程以一种可预测的方式查看另一个线程的执行结果,当线程A进入某同步代码块时,线程B随后进入由同一个锁保护的同步代码块,此时,线程B执行由锁保护的同步代码块时,可以看到线程A之前在同一同步代码块中的所有操作结果,如果没有同步,那么就无法实现上述保证。

  加锁的含义不仅仅局限于互斥行为,还包括内存可见性。为了确保所有线程都能看到共享变量的最新值,所有执行读操作或者写操作的线程都必须在同一个锁上同步。
  • 写回答

1条回答 默认 最新

  • zhangpan_soft 2017-03-11 10:53
    关注
    我给你做个假设,假设线程方法带同步锁,有AB两个线程,假设A先拿到锁,那么,B线程就要等待(线程保证了互斥性),假设A修改了公共变量i;假设i初始值为0,A修改后为10,但是这个时候呢,A修改了i的值,按道理说,B拿到的i的值应该是10,但是在高并发的时候,可能出现这样一种情况,虽然加了同步锁,虽然报证了线程的互斥性,这时候呢A修改了i的值,但是,他还没有把这个i的值同步到公共内存中,这时候B拿到公共内存i的值,显然i的值为0,这时候是不是就不是我们想要的结果?B拿到i的值之后,A修改之后的值才同步到公共内存,那么程序执行之后依然为10,这样就可能造成数据的不完全一致性,特别是高并发的时候,这是个非常严重的问题,假设卖票,抢票的时候,每次抢票-1,然而,在高并发的情况下,虽然保证了互斥性,但是,有可能有上述所说的情况发生,这就会出现什么情况?重号!如果是抢货呢?假设设定为30人,最后实际人数可能达到50人,300人,所以,在多线程公用的变量的时候,不仅要保证线程的互斥性,还要保证线程的可见性,这样,A对i做的操作对B是可见的,这时候才能一直保证程序不会出错,否则就会出现上述所说的情况!研究多线程先学懂java的内存结构,内存结构学懂了,线程也就呢个样了!欢迎关注!欢迎采纳!
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料