2

一个线程是否一次完全运行一个语句,或者该语句可能会被拆分?

例如,在下面的声明中:

public void run() {
    System.out.println(aString + ": " + ++index);
}

可能的执行顺序是什么?

4

3 回答 3

1

无法保证您的代码/语句不会被另一个线程中断。但是您可以使用同步块 -

public void run()
{
    synchronized( this ) {
       System.out.println(aString+ ": " + ++index);
    }
}

这将确保没有线程在打印时尝试中断另一个线程。

于 2013-10-26T17:19:39.573 回答
1

不,不能保证 a 何时Thread会被抢占,因此您不能假设语句会自动完成。事实上,即使是你的预增量++index操作也不能保证不间断地完成(我们有这个原因AtomicInteger)。

枚举可能的执行顺序可能没有用,因为它们会不断地从程序的一次运行更改为另一次运行(假设还有其他线程在起作用)。这就是为什么我们有Lock同步来为多线程代码带来一些控制的原因。

有关更多详细信息,请参阅并发

于 2013-10-26T17:15:03.187 回答
1

中断几乎可以在指令级的任何时间发生。例如,字符串连接将包含新字符串的构造,这些构造将采用多条指令,其中任何一条都可能被中断。打印也将是另一个可能被中断的指令。

如果您想让一个线程在其他线程完成操作之前执行一段代码,请查看:

同步关键字http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html _

信号量
http://docs.oracle.com/javase/tutorial/essential/concurrency/newlocks.html
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore .html

于 2013-10-26T17:16:37.413 回答