当前位置: 首页 > 面试题库 >

同步局部变量

於彬
2023-03-14
问题内容

我注意到ConcurrentHashMapcomputecomputeIfAbsent方法中有一个奇怪的构造:

Node<K,V> r = new ReservationNode<K,V>();
synchronized (r) {
  //...
}

考虑到JIT最有可能将其视为无操作,因此在本地对象上进行同步有什么意义?


问题答案:

在代码获取对象的监视器之后,立即将对对象的引用存储到中tab,该对象是组成节点的全局可见节点数组,这些节点组成了以下内容ConcurrentHashMap

Node<K,V> r = new ReservationNode<K,V>();
synchronized (r) {
    if (casTabAt(tab, i, null, r)) {

此时,在同一线程上执行其他修改方法的其他html" target="_blank">线程ConcurrentHashMap在遍历全局数组时可能会遇到此不完整的节点,换句话说,Node引用已转义。

虽然在ReservationNode构造时就不可能对新创建的对象Node进行争用,但是在与数组中找到的s
同步的其他方法中,可能确实存在争用Node

这就像“优先级同步”。创建者正在同步一个尚未转义引用的点,因此可以保证成功,而在该引用转义的点,所有其他线程都必须等待,如果它们访问的可能性很小(但仍然可能),恰好那样Node



 类似资料:
  • Lua 的设计有一点很奇怪,在一个 block 中的变量,如果之前没有定义过,那么认为它是一个全局变量,而不是这个 block 的局部变量。这一点和别的语言不同。容易造成不小心覆盖了全局同名变量的错误。 定义 Lua 中的局部变量要用 local 关键字来显式定义,不使用 local 显式定义的变量就是全局变量: g_var = 1 -- global var local l_va

  • 简介 在前面的章节中,我已经讲述了如何定义函数。在本节中,我讲介绍局部变量,这将会使定义函数变得更加容易。 let表达式 使用let表达式可以定义局部变量。格式如下: (let binds body) 变量在binds定义的形式中被声明并初始化。body由任意多个S-表达式构成。binds的格式如下: [binds] → ((p1 v1) (p2 v2) ...) 声明了变量p1、p2,并分别

  • 局部变量用于模版渲染,也就是模版中的 site 变量。 默认变量 变量 描述 posts 所有文章 pages 所有分页 categories 所有分类 tags 所有标签 获取变量 hexo.locals.get('posts') 设置变量 hexo.locals.set('posts', function(){ return ... }); 移除变量 hexo.locals.remove(

  • 主要内容:局部变量,全局变量,局部变量和全局变量的综合示例在《 C语言形参和实参的区别》中提到,形参变量要等到函数被调用时才分配内存,调用结束后立即释放内存。这说明形参变量的作用域非常有限,只能在函数内部使用,离开该函数就无效了。 所谓 作用域( Scope ) ,就是变量的有效范围。 不仅对于形参变量,C语言中所有的变量都有自己的作用域。决定变量作用域的是变量的定义位置。 局部变量 定义在函数内部的变量称为 局部变量(Local Variable) ,

  • 问题内容: 此代码为何起作用: 但这给出了“分配前引用的局部变量’var’”错误: 问题答案: 因为在第一个代码中,您已经创建了一个局部变量并使用了它的值,而在第二个代码中,您正在使用局部变量,而没有对其进行定义。 因此,如果要使第二个功能正常工作,则需要声明:- 在使用该功能之前。 而在此代码中: 更新 :- 但是,按照@Tim的注释,您不应在函数内部使用变量。最好在使用变量之前先定义变量,然后

  • 问题内容: 我了解Python中局部变量和全局变量的概念,但是我只是有一个问题,为什么下面的代码中会出现错误?Python逐行执行代码,因此在读取第5行之前,它不知道a是局部变量。Python尝试执行第5行后,会回退一行并将其标记为错误吗? 问题答案: 设置和测试 为了分析您的问题,让我们创建两个独立的测试函数来复制您的问题: 版画。因此,调用此函数不是问题,而是在下一个函数上: 我们收到一个错误