为什么有时(在一个线程中)效果对其他线程不可见?

阿索斯

我正在阅读Paul Butcher的“七个星期内的七个并发模型”,在第2.2章中提供了示例代码“ puzzle.java”:

ThreadsLocks/Puzzle/src/main/java/com/paulbutcher/Puzzle.java public class Puzzle { static boolean answerReady = false; static int answer = 0; static Thread t1 = new Thread() { public void run() { answer = 42; answerReady = true; } }; static Thread t2 = new Thread() { public void run() { if (answerReady) System.out.println("The meaning of life is: " + answer); else System.out.println("I don't know the answer"); } }; public static void main(String[] args) throws InterruptedException { t1.start(); t2.start(); t1.join(); t2.join(); } }

所以这是一个赛车条件。

然后说

想象一下,我们重写了run(),如下所示:

public void run() { while (!answerReady) Thread.sleep(100); System.out.println("The meaning of life is: " + answer); }

我们的程序可能永远不会退出,因为answerReady可能永远不会变成真实。

请问为什么?

保罗·布彻(Paul Butcher)

如果我未能在书中清楚地解释这一点,请原谅我。我会在这里再试一次:-)

您需要识别的第一件事是,t2只有当answerReady变为时,循环才会退出true唯一将其设置为的truet1

因此,换句话说,t2要退出,它需要查看所做的内存更改t1

问题是,除非代码正确同步,否则JVM无法保证一个线程所做的更改是否可被另一个线程看到

由于此代码未正确同步(没有使用任何锁),因此JVM无法保证是否t2会看到对的更改answerReady因此,循环可能永远不会退出。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

什么时候可以保证一个线程上的值更改对其他线程可见?

来自分类Dev

为什么有时CNN模型只能预测所有其他类别中的一个类别?

来自分类Dev

为什么只有一个线程被执行而其他线程没有被执行

来自分类Dev

为什么一个Java线程会阻止在其他线程中完成的OpenGL渲染?

来自分类Dev

为什么找不到确切的一个wifi,而所有其他wifi都在“可用的wifi”中可见?

来自分类Dev

在Visual C#中其他线程正在工作时,如何使一个线程休眠?

来自分类Dev

在Visual C#中其他线程正在工作时,如何使一个线程休眠?

来自分类Dev

为什么扩展功能在另一个模块中不可见?

来自分类Dev

Java线程-第一个线程完成时关闭其他线程

来自分类Dev

为什么在其他线程中创建窗口时有时会出现“无效的窗口句柄”异常

来自分类Dev

为什么在其他线程中创建窗口时有时会出现“无效的窗口句柄”异常

来自分类Dev

为什么一个不可见的 TableView 覆盖了一个标签?

来自分类Dev

为什么写文件二进制方法有时返回一个字母而其他一个十六进制?

来自分类Dev

当一个线程修改了全局变量时,它也对另一线程可见吗?

来自分类Dev

当所有其他线程在主线程之前完成时,为什么仍然需要.join?

来自分类Dev

当一个线程由于断点而冻结时,是否可以让其他线程继续运行

来自分类Dev

当一个线程希望执行或打印某些内容时,如何挂起其他线程?

来自分类Dev

仅当其他两个符号在 ActionScript 3.0 中可见时,如何才能使一个符号可见?

来自分类Dev

强制一个线程阻止所有其他线程执行

来自分类Dev

更改其他线程中的值并断言后一个(在“主”线程中)

来自分类Dev

java中同一个线程调用start()方法两次,有时执行run()方法两次;内部究竟发生了什么?

来自分类Dev

为什么多线程有一个Lock对象?

来自分类Dev

为什么只有在使用另一个线程时才能获取webBrowser的状态?

来自分类Dev

为什么在使用Async.Parallel时只有一个线程ID?

来自分类Dev

了解只有一个线程执行写操作时为什么发生竞争条件

来自分类Dev

为什么有时我会在 react 中看到一个箭头函数,而其他只是事件处理程序上的函数?

来自分类Dev

Go中的原子操作是否确保其他变量对其他线程可见?

来自分类Dev

在c中,如何使一个线程等待其他线程完成

来自分类Dev

重叠div时一个div不可见

Related 相关文章

  1. 1

    什么时候可以保证一个线程上的值更改对其他线程可见?

  2. 2

    为什么有时CNN模型只能预测所有其他类别中的一个类别?

  3. 3

    为什么只有一个线程被执行而其他线程没有被执行

  4. 4

    为什么一个Java线程会阻止在其他线程中完成的OpenGL渲染?

  5. 5

    为什么找不到确切的一个wifi,而所有其他wifi都在“可用的wifi”中可见?

  6. 6

    在Visual C#中其他线程正在工作时,如何使一个线程休眠?

  7. 7

    在Visual C#中其他线程正在工作时,如何使一个线程休眠?

  8. 8

    为什么扩展功能在另一个模块中不可见?

  9. 9

    Java线程-第一个线程完成时关闭其他线程

  10. 10

    为什么在其他线程中创建窗口时有时会出现“无效的窗口句柄”异常

  11. 11

    为什么在其他线程中创建窗口时有时会出现“无效的窗口句柄”异常

  12. 12

    为什么一个不可见的 TableView 覆盖了一个标签?

  13. 13

    为什么写文件二进制方法有时返回一个字母而其他一个十六进制?

  14. 14

    当一个线程修改了全局变量时,它也对另一线程可见吗?

  15. 15

    当所有其他线程在主线程之前完成时,为什么仍然需要.join?

  16. 16

    当一个线程由于断点而冻结时,是否可以让其他线程继续运行

  17. 17

    当一个线程希望执行或打印某些内容时,如何挂起其他线程?

  18. 18

    仅当其他两个符号在 ActionScript 3.0 中可见时,如何才能使一个符号可见?

  19. 19

    强制一个线程阻止所有其他线程执行

  20. 20

    更改其他线程中的值并断言后一个(在“主”线程中)

  21. 21

    java中同一个线程调用start()方法两次,有时执行run()方法两次;内部究竟发生了什么?

  22. 22

    为什么多线程有一个Lock对象?

  23. 23

    为什么只有在使用另一个线程时才能获取webBrowser的状态?

  24. 24

    为什么在使用Async.Parallel时只有一个线程ID?

  25. 25

    了解只有一个线程执行写操作时为什么发生竞争条件

  26. 26

    为什么有时我会在 react 中看到一个箭头函数,而其他只是事件处理程序上的函数?

  27. 27

    Go中的原子操作是否确保其他变量对其他线程可见?

  28. 28

    在c中,如何使一个线程等待其他线程完成

  29. 29

    重叠div时一个div不可见

热门标签

归档