Java并发编程4-Sleep和Yield

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:好的,再见。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值