是否thread.yield()失去对象的锁如果调用一个synchronized方法里面?(Does

2019-06-24 15:04发布

据我所知, Thread.currentThread().yield()是线程,它可能CPU周期分配给相同的优先级的某些其它线程,如果任何这样的存在调度器的通知。 我的问题是:如果当前线程已经得到了一些对象上的锁,并调用yield()将它丢失了锁,对吗? 当线程调度器发现不存在这样的线程分配CPU周期,然后把已经被称为线程yield()将再次在争取拿到它已经失去了早期的对象锁?

在Javadoc和论坛[http://www.coderanch.com/t/226223/java-programmer-SCJP/certification/does-sleep-yield-release-lock]有50-50答案,我找不到它。

我认为yield()可以说线程1)应该释放锁,因为如果某个线程(可以说线程2)相同的优先级要同一对象进行操作,那么就可以有机会时,线程调度器最终分配杯线程2。

Answer 1:

Thread.yield()是不喜欢Object.wait() 它只是放弃控制,允许线程切换。 它会对你的程序的并发性没有任何影响。

谁也不能保证哪个线程调度会屈服后运行。



Answer 2:

在Java语言规范
17.3睡眠和产量
需要注意的是,无论的Thread.sleep也不Thread.yield有任何同步语义是很重要的。 特别地,编译器不具有以清空寄存器缓存出到共享存储器的写入呼叫前的Thread.Sleep或Thread.yield,也不编译器有一个呼叫的Thread.Sleep或线程之后重新加载在寄存器中高速缓存的值。让。

我的评论:

在Java的早期,当它没有真正支持并行执行,但只有并发(绿线), yield()已暂停当前线程,和JVM是拿起另一个线程来恢复。 现在天, yield并没有太大的意义,通常胎面调度是在操作系统级别。

因此, yield仅是一种暗示到当前线程想休息一会,并没有其他的JVM,它是由线程调度器来决定做什么。 yield没有任何语义的同步。 如果线程持有锁,它将继续持有它。



Answer 3:

只有等到当前实例的内部锁Object类的释放方法(线程可能有其他的锁收购,他们没有得到释放)。 产量,睡眠,加入不操心锁。 然而,加入有一点比较特殊,你肯定可以看到你在等待完成线程所做的所有更改。



文章来源: Does thread.yield() lose the lock on object if called inside a synchronized method?