- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在看 Chapter 17. Threads and Locks of JLS以下关于 Java 中顺序一致性的陈述对我来说似乎不正确:
If a program has no data races, then all executions of the program will appear to be sequentially consistent.
When a program contains two conflicting accesses (§17.4.1) that are not ordered by a happens-before relationship, it is said to contain a data race.
Two accesses to (reads of or writes to) the same variable are said to be conflicting if at least one of the accesses is a write.
A write to a volatile field (§8.3.1.4) happens-before every subsequent read of that field.
// Shared code
volatile int vv = 0;
int v1 = 0;
int v2 = 0;
// Thread1 Thread2
v1 = 1;
v2 = 2;
vv = 10; while(vv == 0) {;}
int r1 = v1;
int r2 = v2;
System.out.println("v1=" + r1 + " v2=" + r2);
v1 = 3;
v2 = 4;
vv = 20;
在上面的代码中,我还用缩进展示了线程的代码在运行时是如何交错的。
v1=1 v2=4
(这违反了顺序一致性)。 If a program has no data races, then all executions of the program will appear to be sequentially consistent.
v1=1 v2=4
具有顺序一致性——线程代码中的行应该以稍微不同的方式交错。
v1=1 v2=4
,但一切仍然适用。
// Shared code
volatile int vv = 0;
int v1 = 0;
int v2 = 0;
// Thread1 Thread2
v1 = 1;
v2 = 2;
vv = 10; while(vv == 0) {;}
int r2 = v2;
int r1 = v1;
System.out.println("v1=" + r1 + " v2=" + r2);
v1 = 3;
v2 = 4;
vv = 20;
最佳答案
您的错误在要点#1:v1
的读数和 v2
不同步。
只有与 vv
的交互才会创建发生之前的关系。 ,例如在这种情况下,如果您添加了 vv
到打印语句的开头,您肯定不会看到 vv=20,v2=4
.由于您忙-等待vv
变为非零,然后不再与它交互,唯一的保证是您将看到它变为非零之前发生的所有效果(1 和 2 的赋值)。您可能还会看到 future 的影响,因为您没有任何进一步的发生之前。
即使您将所有变量声明为 volatile,您仍然可以输出 v1=1,v2=4
因为变量的多线程访问没有定义的顺序,全局顺序可以是这样的:
v1=1
v2=2
vv=10
(线程 2 不能在此之前退出 while 循环,并且保证看到所有这些效果。)vv=10
v1=1
v1=3
v2=4
v2=4
synchronized
中执行。阻止或将所有值放入记录类并使用
volatile
或
AtomicReference
换出整个记录。
关于Java 内存模型 : a JLS statement about sequential consistency seems incorrect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65527237/
所以,我试图写一种方法来回答我之前的一个问题:How can I find out if an arbitrary java.lang.Method overrides another one?为此,
我想知道类中定义的静态方法和静态变量是否被视为该类的成员(或者术语“成员”是否仅意味着实例变量/方法和内部类) Java 中的类由哪些成员组成? 最佳答案 JLS 中成员的定义如 §8 中所定义。是:
我刚刚发现在类中的包声明之前可以写几个修饰符。似乎所有可见性修饰符以及字段修饰符都是允许的,并且所有这些修饰符都可以多次使用。声明可能如下所示: public public final static
我尝试从根本上理解 Java 中的类型转换,但无法理解 JLS 的某些部分。 特别是这个(将类类型 S 转换为类或接口(interface)类型 T 的含义): Furthermore, if the
根据 Java 语言规范 (Example 17.4-1),以下代码段(从 A == B == 0 开始)... Thread 1 Thread 2 --------
Java是语言,JRE是运行环境,JDK是开发工具? JLS 是说明 JRE 必须执行 x、y、z 的规范,因此使 Java 成为现实?这些观点是否正确,如果不正确,谁能赐教? 有没有我们认为是 Ja
请查看 Oracle Specification - Chapter 5 . 这一行: A widening primitive conversion does not lose informatio
JLS 15.13 lists examples方法引用表达式。其中之一是 (test ? list.replaceAll(String::trim) : list) :: iterator 这没有意
我在处理一些字节码时遇到了一个问题,其中某个 final String 常量没有被 java 编译器 (Java 8) 内联,请参见下面的示例: public class MyTest { pri
我有 recently discovered and blogged about the fact可以通过 javac 编译器偷偷检查异常并将其抛出到不应抛出的地方。这在 Java 6 和 7 中编译
给定以下使用 Java 8 的类 Optional : final class Main { public static void main(final String[] args) {
只是说,我的问题的重点是学会理解jls。我相信jls中的一切都是真的。 考虑 jls 的下一个片段: 8.4.8.1. Overriding (by Instance Methods) An inst
直接来自这个jls : A try-with-resources statement with a ResourceSpecification clause that declares multipl
我收到一封来自 mailing list 的邮件其中表示,如果对 volatile 变量的操作包含数据竞争,则无法应用保证(“当且仅当所有顺序一致的执行都没有数据竞争时,程序才能正确同步。” JLS
我正在阅读 jls 并遇到以下术语: return-type-substitutable 来自 jls 的片段 A method declaration d1 with return type R1
我正在为以下句子寻找合法的 JLS 引用: Vector vector = PreJava5API.getRawVector(); 最佳答案 这是给你的报价(4.8. Raw Types): The
来自Java Language Specification (third edition), section 3.10.5 : StringLiteral: " StringCharac
根据 JLS example for volatile,以下代码是否应该在 Windows 7 x86 jdk 7(打开 -ea)上抛出 AssertionError ? public class T
我对这个程序的输出有点迷惑: public class xx { public static void main(String[] args) throws Exception {
我想知道使用像这样的构造是否可靠: private static final Map engMessages; private static final Map rusMessages; static
我是一名优秀的程序员,十分优秀!