lockObj

来源:4-4 Java线程交互之深入剖析互斥与同步

笙__笙

2017-11-22 14:57

为什么 要用while循环 在讲互斥时候 while(energyBoxs[from]<amount){lockObj.wait()}

写回答 关注

1回答

  • 慕田峪3134475
    2017-11-24 15:36:05
    synchronize(lockObj) { <------- 这个获取锁操作会增加系统开销
        if(energyBoxs[from]<amount){
            return;
        }
        ...
    }
    之前的写法:每次成功获取锁之后,先条件判断,若为false,则返回,释放锁。
    然后又要再次获取锁,这样操作会以很大的系统开销作为代价的。改成下面写法的话:
    synchronize(lockObj) { 
        while(energyBoxs[from]<amount){
            lockObj.wait();
        }          
    }
    就是为了减小系统开销


    亚历山魈 回复笙__笙

    因为notifyAll()唤醒后选择WaitSet中的等待线程是随机选择的

    2018-09-18 18:33:01

    共 4 条回复 >

深入浅出Java多线程

带你一起深入浅出多线程,掌握基础,展望进阶路线

186088 学习 · 464 问题

查看课程

相似问题