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

15-04-19 abaddoncoder
         

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

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();
     }
}

<p>

针对以上测试结果,想看看各位道友的看法

[该贴被abaddoncoder于2015-04-19 14:12修改过]

         

banq
2015-04-20 08:45

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

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

abaddoncoder
2015-04-23 10:02

非常感谢banq这么快就回复

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

banq
2015-04-24 20:56

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