Java多线程程序中的对象可见性

时间:2018-12-13 18:27:58

标签: java multithreading

我正在研究 Java:并发实践,在第三章中,作者写道:

“ ...只要无法从该线程内检测到重新排序,就无法保证将按照程序给定的顺序在一个线程中执行操作。其他线程。...“

我知道一个线程中语句的实际执行顺序可能不是程序中编写的(取决于编译器的优化和内容)。但是由于某种原因,我无法解读作者的神秘说法。

“ ...不能保证一个线程中的操作将按照程序给定的顺序执行...” -好的。语句的实际执行顺序可能有所不同。

“ ...只要在该线程内无法检测到重新排序,即使该重新排序对于其他线程是显而易见的...” -的含义....可从线程内检测到。...“

3 个答案:

答案 0 :(得分:3)

这只是意味着执行任何重新排序都不会使您可以通过查看代码对该线程可见的状态断言无效。

作为一个简单的例子:

/* 1 */ x = 0;
/* 2 */ boolean c = x == 0;
/* 3 */ x = 1;

不允许将3移到2之前,因为c的值会检测到这一点。

换句话说,允许在其他线程查看时可能会创建错误的重新排序,但不允许在线程中创建错误的重新排序允许。

答案 1 :(得分:1)

我不得不在这里稍作猜测,但这是我的看法:您编写了一个程序,该程序创建了不同的线程进行处理;创建线程A,启动它,创建线程B,启动它,等等。

不能保证线程A会在线程B之前运行。这很可能,甚至可能是最常见的,但是并发编程的一部分正在从您的思维中消除这种假设。如果B逻辑的任何部分首先依赖于A逻辑的任何部分,那么您需要自己进行编程以保证-您在B之前创建A的事实,或者您在在线程协调逻辑之外做过任何其他事情,将保证A的任何部分都将在B的任何部分之前执行。

至于“在线程内可检测”,我认为它们的意思是某种信号量,变量,锁等,它们使一个线程可以了解其他线程的完成情况。

我认为使用“程序给定的顺序”会使他们感到困惑,这确实模棱两可,尤其是对于刚开始考虑并发编程的人们而言。这并不意味着无论语句在何处都可以重新排序。

有帮助吗?

答案 2 :(得分:1)

我要说的是,这意味着“检测”顺序的线程将遵循执行顺序,但并非所有线程都将以这种方式运行。