- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我阅读了以下程序并在博客中回答。
int x = 0;
boolean bExit = false;
x = 1;
bExit = true;
if (bExit == true)
System.out.println("x=" + x);
x=0
”?
最佳答案
这实际上比看起来要复杂。有一些不可思议的事情在起作用。
缓存
说“每个线程都有自己的变量副本”并不完全正确。每个线程可能都有自己的变量副本,它们可能会也可能不会将这些变量刷新到共享内存中和/或从中读取它们,因此整个过程是不确定的。此外,术语“冲洗”实际上是与实现有关的。有严格的术语,例如内存一致性,先发生顺序和同步顺序。
重新排序
这是一个更神秘的东西。这
x = 1;
bExit = true;
1
写入
x
,然后将
true
写入
bExit
。实际上,它甚至不保证所有这些都会发生。如果以后不使用某些值,则编译器可能会优化掉某些值。编译器和CPU也被允许以他们想要的任何方式对指令重新排序,只要结果与如果一切都按程序顺序真正发生时所发生的情况没有区别即可。也就是说,对于当前线程来说是无法区分的!直到...之前,没有人关心其他线程。
volatile
变量解决问题的想法。在这种情况下,将
bExit
设置为volatile可能就足够了,但是麻烦太多了,使用volatile可能会导致我什至不愿讨论。但是可以肯定的是:使用
synchronized
的效果比使用
volatile
的效果要强得多,这对内存效果也很重要。更糟糕的是,
volatile
语义在某些Java版本中发生了变化,因此可能存在一些仍使用旧语义的版本,这些语义更加晦涩难懂,而
synchronized
在您了解它是什么以及如何使用的情况下始终可以很好地工作。
volatile
的唯一原因几乎就是性能,因为
synchronized
可能会导致锁争用和其他麻烦。阅读《实践中的Java并发性》以了解所有内容。
1) You wrote "now flush whatever you've been doing there to the shared memory" about synchronized blocks. But we will see only the variables that we access in the synchronize block or all the changes that the thread call synchronize made (even on the variables not accessed in the synchronized block)?
2) In this chapter you post (of JLS) it is written that: "A write to a volatile field (§8.3.1.4) happens-before every subsequent read of that field." Doesn't this mean that when the variable is volatile you will see only changes of it (because it is written write happens-before read, not happens-before every operation between them!). I mean doesn't this mean that in the example, given in the description of the problem, we can see bExit = true, but x = 0 in the second thread if only bExit is volatile? I ask, because I find this question here: http://java67.blogspot.bg/2012/09/top-10-tricky-java-interview-questions-answers.html and it is written that if bExit is volatile the program is OK. So the registers will flush only bExits value only or bExits and x values?
bExit = true
之后执行
x = 1
,则由于程序顺序,存在线程内事前发生关系。现在,由于 volatile 写入发生在 volatile 读取之前,因此可以保证第二个线程将看到在将
true
写入
bExit
之前第一个线程更新的内容。请注意,此行为仅是从Java 1.5左右开始的,因此较旧的或错误的实现可能会或可能不支持此行为。我已经在使用此功能的标准Oracle实现中看到了一些东西(java.concurrent集合),因此您至少可以假定它在此起作用。
3) Why monitor matters when using synchronized blocks about memory visibility? I mean when try to exit synchronized block aren't all variables (which we accessed in this block or all variables in the thread - this is related to the first question) flushed from registers to main memory or broadcasted to all CPU caches? Why object of synchronization matters? I just cannot imagine what are relations and how they are made (between object of synchronization and memory). I know that we should use the same monitor to see this changes, but I don't understand how memory that should be visible is mapped to objects. Sorry, for the long questions, but these are really interesting questions for me and it is related to the question (I would post questions exactly for this primer).
4) I thought that everything before writing a volatile will be up to date when we read it (moreover when we use volatile a read that in Java it is memory barrier), but the documentation don't say this.
17.4.5. If x and y are actions of the same thread and x comes before y in program order, then hb(x, y).
If hb(x, y) and hb(y, z), then hb(x, z).
A write to a volatile field (§8.3.1.4) happens-before every subsequent read of that field.
x = 1
在
bExit = true
之前,那么我们在它们之间发生-before。如果之后有其他线程读取
bExit
,则发生在写入和读取之间。并且由于可传递性,我们还发生在
x = 1
和第二个线程读取
bExit
之间之前。
5) Also, if we have volatile Person p does we have some dependency when we use p.age = 20 and print(p.age) or have we memory barrier in this case(assume age is not volatile) ? - I think - No
age
不易失,因此没有内存障碍,这是最棘手的事情之一。例如,这是
CopyOnWriteArrayList
的片段:
Object[] elements = getArray();
E oldValue = get(elements, index);
if (oldValue != element) {
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len);
newElements[index] = element;
setArray(newElements);
} else {
// Not quite a no-op; ensures volatile write semantics
setArray(elements);
getArray
和
setArray
是
array
字段的重要设置者和获取者。但是由于代码更改了数组的元素,因此有必要将对数组的引用写回到它的原始位置,以使对数组元素的更改变得可见。请注意,即使要替换的元素与最初存在的元素相同,也可以这样做!正是因为该元素的某些字段可能已被调用线程更改,并且有必要将这些更改传播给将来的读者。
6) And is there any happens before 2 subsequent reads of volatile field? I mean does the second read will see all changes from thread which reads this field before it(of course we will have changes only if volatile influence visibility of all changes before it - which I am a little confused whether it is true or not)?
关于java - 同步关键字在内部如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34675937/
如果我创建一个对象时没有使用 new 关键字,例如“Object s(someval)”,但该对象的构造函数使用了 new,当该对象超出范围时,是否会调用析构函数为其分配新的空间?我感觉好像是,但我不
在 SQL 语法中,我发现奇怪的规则表明 select * from ONLY (t1)是有效的 SQL。 我的问题是:什么是 ONLY在这种情况下是什么意思? 它在规范的“7.6 table ref
为什么使用 $(this) 而不是重新选择类很重要? 我在代码中使用了大量的动画和 CSS 编辑,并且我知道可以使用 $(this) 来简化它。 最佳答案 当您通过 jQuery 执行 DOM 查询(
我正在尝试使用 IN 关键字编写查询。 表A 属性标识、属性名称 表B key 、属性标识、属性值 根据提供的 key ,我想返回所有 attrName、attrVal 组合。结果将包含两个表中的列。
这个问题在这里已经有了答案: Why would you use "AS" when aliasing a SQL table? (8 个答案) 关闭 9 年前。 我不擅长写查询,但是从我开始使用
我读过,在 Java 中,您不必将 this 关键字显式绑定(bind)到对象,它由解释器完成。它与 Javascript 相反,在 Javascript 中你总是必须知道 this 的值。但是 Ja
Swift 中“with”关键字的用途是什么?到目前为止,我发现如果您需要覆盖现有的全局函数,例如 toDebugString,可以使用该关键字。 // without "with" you
这个问题在这里已经有了答案: What does the keyword "where" in a class declaration do? (7 个答案) 关闭 9 年前。 在下面的一段代码中(
免责声明:swift 菜鸟 您好,我刚刚开始学习 Swift,正在学习 Swift 编程语言(Apple 在 WWDC 期间发布的书籍),并且想知道“where”关键字是什么。它用于 let vege
深入研究文档后,我找不到以下问题的答案: 是否有任何理由反对使用 this 来引用当前对象,如下例所示? type MyStruct struct { someField string } fun
前言 最近在做THINKPHP开发项目中,用到了 parent:: 关键字,实际上 parent::关键字 是PHP中常要用到的一个功能,这不仅仅是在 THINKPHP 项目开发中,即使是一个小型
我们都知道且经常用到 unsigned 关键字,但有没有想过,与此对应的 signed 关键字有啥用? 复制代码 代码如下: int i = 0; signed
this关键字再java里面是一个我认为非常不好理解的概念,:)也许是太笨的原因 this 关键字的含义:可为以调用了其方法的那个对象生成相应的句柄。 怎么理解这段话呢? thinking i
一 什么是 synchronized synchronized 关键字提供了一种锁机制,能够确保共享变量互斥访问,从而防止数据不一致问题的出现。 synchronized 关键字包括 monitor
最近看了几篇 synchronized 关键字的相关文章,收获很大,想着总结一下该关键字的相关内容。 1、synchronized 的作用 原子性:所谓原子性就是指一个操作或者多个操作,要么全部执行并
在本教程中,您将借助示例了解 JavaScript 对象方法和 this 关键字。 在 JavaScript 中,对象也可以包含函数。例如, // object containing meth
有人可以解释一下 PHP“with”的作用吗? 示例开始: 假设我有一个类: \App\fa_batch 这句话有什么区别: $w = (with (new \App\fa_batch))
这个问题在这里已经有了答案: What is the difference between using the colon and as syntax for declaring type? (2
如果我在 WHERE 子句中使用以下任一项,是否会有很大不同: WHERE [Process Code] = 1 AND ([Material ID] = 'PLT' OR [Material ID]
This question is unlikely to help any future visitors; it is only relevant to a small geographic are
我是一名优秀的程序员,十分优秀!