java吧 关注:1,298,037贴子:12,834,078
  • 5回复贴,共1

老哥们问个问题,关于锁的

只看楼主收藏回复

synchronized (lock) {
int a = sharedVar;
...其他逻辑
int b = sharedVar;
}
这两次对于共享变量shareVar的获取都是从主内存拿的吗,也就是说,即使在执行其他逻辑的过程中,其他线程没有通过同一锁就更新了shareVar的值,也能反映到上述代码第二次获取shareVar的值吗
还是说只有在 int a = sharedVar; 第一次获取才是从主内存拿的,后续在同步代码块中再多次获取都是缓存值了。
我想知道在上述锁的临界区中,对于同一共享变量的多次获取是如何拿到的


IP属地:安徽1楼2025-03-24 10:38回复
    sharedVar是在主内存中拿的,其他线程更改了这个值,如果同步到主内存,则int b能拿到新的值,否则不能。


    IP属地:上海来自Android客户端2楼2025-03-24 11:07
    收起回复
      2026-02-23 22:32:50
      广告
      不感兴趣
      开通SVIP免广告
      应该是的 sync 锁跟 volatile 原理一样吧 写法不一样 后者更简洁 进入sync 包住的代码之前 内部做的事 跟读取被 volatile 修饰的变量一样 获取的是最新的


      IP属地:安徽来自iPhone客户端4楼2025-03-24 11:28
      回复
        B再获取的意义在哪,为什么不int b = a = sharedVar 呢,你这么写我默认你逻辑中间对共享变量要进行修改,那如果你的lock中不包括sharedVar,那么本来对sharedVar的读写就有并发问题,无论从哪个内存获取,无论加不加volatile。


        IP属地:山东来自Android客户端5楼2025-05-03 17:46
        回复