线程等待两种方法的唤醒的效率比较

一直认为无锁比有锁快,性能更高,可是以下这个线程等待测试结果,却跟自己想得不一样:


public class CallResult {
private volatile boolean noFinish = true;

public boolean isNoFinish() {
return commandIsFinish;
}

public void setNoFinish(boolean noFinish) {
this.noFinish= noFinish;
}

}

CallResult callResult = new CallResult();
// .... 把callResult放到队列,让队列另一端的线程去处理

/* 1. 无锁等待方式,等待队列另一端的线程把isNoFinish设值为false */
while(callResult.isNoFinish) {
Thread.yield();
}

/* 2. 锁等待方式, 等待队列另一端的线程notify(). 测试结果这种方式性能更高*/
synchronized (callResult) {
try {
callResult.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

针对以上测试结果,想看看各位道友的看法
[该贴被abaddoncoder于2015-04-19 14:12修改过]

while和synchronized 都是堵塞CPU的,While好像是不用锁,其实比锁还要更加粗暴,完全让CPU不喘气的疯狂循环,CPU当然无暇处理其他事情。建议其中增加一个sleep。

如果非得用锁,先后次序是CAS>读写锁>synchronized>While

非常感谢banq这么快就回复
针对上面这个等待的场景,如果在while里sleep,sleep多久不好确定,因为有可能对端很快就处理完了,处理的时间小于sleep的时间,那sleep就多等待了,有没有什么更好的办法

更好的办法当然是使用Reactive编程,也就是观察者模式,具体见RxJava