J:今天打算和大家分享什么呢?
T:今天准备学习一下Thread的两个静态方法:sleep和yield。
J:sleep就是睡眠的意思吗?
T:是的,sleep在指定的时间内让当前正在执行的线程睡眠,但睡眠的时间受到系统计时器和调度程序精度和准确性的影响。
J:我记得前面讲到过sleep操作不会导致线程丢失监视器的所有权,是吧?
T:是的,线程不丢失监视器的所有权,但执行的恢复依赖线程所在处理器的调度和可用性。
J:那yield呢?
T:yield暂停当前正在执行的线程对象,并执行其他线程。
J:使用他们有什么需要注意的吗?
T:sleep和yield都不需要添加任何同步语法。但需要注意的是,编译器在调用Thread.sleep或者Thread.yield之前不必刷新寄存器缓存到共享缓存,在Thread.sleep或者Thread.yield也不必重新载入寄存器缓存的值。
J:有点深奥。
T:通过下面的例子来看就简单了:
public class Test {
private boolean done = false;
public void doIt() {
while (!this.done) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
......
}
在这里,编译器可以只读取this.done一次,然后每次执行时都重用缓存中的值。这也意味着即使别的线程改变了this.done的值,循环也一直不会停止。
J:但是如果多个线程同时会修改this.done,那this.done不是应该使用同步吗?
T:是的,this.done应该定义为一个volatile变量,这样就不会有问题了。
J:也就是说只要正确的使用了同步,就不会出现这个问题了,是吧?
T:是的。
J:那就没什么好担心的了。
T:呵呵,对自己那么有信心。好了,今天就到这里了,下次我们将学习Java存储模式,下次再见。
J:好的,再见。