Java8:可变字段如何与 lambda 一起工作
Java8: How volatile field work with lambda
我是 Java8 和多线程工作的新手。我在下面尝试了这段代码
public class Test {
public static boolean bchanged = true;
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
while (true) {
if (bchanged != bchanged) {
System.out.println("here");
}
}
}
}
).start();
new Thread((Runnable) () -> {
while (true) {
bchanged = !bchanged;
}
}).start();
}
}
我在运行这段代码的时候,没有"here"的打印。但是,当我更改
public static volatile boolean bchanged = true;
然后"here"会被打印出来。
我最初的推论是,lambda 将具有布尔值的本地副本,并且当它不是易失性时它不会影响另一个线程,但是当我尝试在两个线程中打印出布尔值时,事实证明我错了。所以在这种情况下我很困惑,volatile
如何影响 lambda 的工作方式。
这与 lambda 无关,这是关于在多个线程中访问共享变量。您需要使用 synchronized
、锁、AtomicBoolean
、volatile
或其他一些线程安全替代方法。使用您编写的代码,编译器可能会缓存 bchanged
的值。它不知道有另一个线程正在修改它,所以第一个线程看到了一个陈旧的缓存值。
如其他答案所述,volatile 和 lambda 没有任何关系。
Volatile 正在打印 "here" 因为变量 "bchanged" 的值没有缓存为 "the volatile keyword in Java is used as an indicator to Java compiler and Thread that do not cache value of this variable and always read it from main memory".
您可以使用以下链接了解有关 volatile 的更多信息。
阅读更多:http://javarevisited.blogspot.com/2011/06/volatile-keyword-java-example-tutorial.html#ixzz4ZlvIJYzZ
编程之洞:https://www.youtube.com/watch?v=_aNO6x8HXZ0&t=113s
我是 Java8 和多线程工作的新手。我在下面尝试了这段代码
public class Test {
public static boolean bchanged = true;
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
while (true) {
if (bchanged != bchanged) {
System.out.println("here");
}
}
}
}
).start();
new Thread((Runnable) () -> {
while (true) {
bchanged = !bchanged;
}
}).start();
}
}
我在运行这段代码的时候,没有"here"的打印。但是,当我更改
public static volatile boolean bchanged = true;
然后"here"会被打印出来。
我最初的推论是,lambda 将具有布尔值的本地副本,并且当它不是易失性时它不会影响另一个线程,但是当我尝试在两个线程中打印出布尔值时,事实证明我错了。所以在这种情况下我很困惑,volatile
如何影响 lambda 的工作方式。
这与 lambda 无关,这是关于在多个线程中访问共享变量。您需要使用 synchronized
、锁、AtomicBoolean
、volatile
或其他一些线程安全替代方法。使用您编写的代码,编译器可能会缓存 bchanged
的值。它不知道有另一个线程正在修改它,所以第一个线程看到了一个陈旧的缓存值。
如其他答案所述,volatile 和 lambda 没有任何关系。
Volatile 正在打印 "here" 因为变量 "bchanged" 的值没有缓存为 "the volatile keyword in Java is used as an indicator to Java compiler and Thread that do not cache value of this variable and always read it from main memory".
您可以使用以下链接了解有关 volatile 的更多信息。
阅读更多:http://javarevisited.blogspot.com/2011/06/volatile-keyword-java-example-tutorial.html#ixzz4ZlvIJYzZ
编程之洞:https://www.youtube.com/watch?v=_aNO6x8HXZ0&t=113s