java trylock lock_java-tryLock()在循环中?

几乎没有,没有.

如果您需要获取锁,则只需使用lock()调用.如果有的话,它将立即获得它,否则,将等待它.在tryLock()上反复循环也具有等待锁(如果锁不可用)的效果,但是不允许适当的OS控制的阻塞和唤醒等待线程.相反,等待线程将继续占用CPU,从而消耗CPU时间和功率,同时等待释放锁.

在最坏的情况之一2中,拥有该锁的线程可能会被上下文切换出,并等待可用的CPU继续运行,但是该CPU不可用,因为线程正忙于在tryLock上循环使用它.它几乎是临时死锁的形式-临时死锁,因为最终tryLock线程将使用其量子并被调度,但整个过程可能比使用lock()的常规方法花费许多数量级.

只能说tryLock()的用途非常有限.如果您在紧密循环中使用tryLock(),则几乎可以肯定您做错了什么.当您确实不需要获取锁定并可以执行其他工作并且性能很重要时,最好使用它.

例如,您必须在几个独立的对象上执行相同的操作,每个对象都有自己的锁.默认方法只是简单地依次锁定每个对象的lock()和unlock().一种可能更快的方法是,首先对每个对象进行tryLock(),更新对其获得锁的对象(也许您多次执行此操作),然后将首次丢失的所有对象返回给lock().通过最初不等待任何锁定,而是继续处理其余对象,可以在竞争的系统中获得更高的更新率.

tryLock()可能有用的另一种情况是,您可以通过多种方式实现相同的效果.想象一下例如某种“分布式计数器” 1,其中您有一个逻辑计数器,该逻辑计数器实现为N个单独的等效计数器,每个计数器都有自己的锁.逻辑计数器的值只是N个基础计数器的总和.要增加计数器(例如),您只需要增加N个计数器中的任何一个即可.在这种情况下,尝试更新计数器的人可以只尝试锁定基础计数器,直到找到“可用”的计数器并对其进行修改.这可能比具有单个锁的单个计数器更好地扩展.

1当然,对于简单的计数器,您可能会使用原子整数,例如AtomicInteger或更好的LongAdder-但对于更复杂的结构,这可能是现实的.

2如果tryLock()线程的优先级比拥有锁的线程高,并且调度策略严格地处理优先级(即,低优先级的线程从不抢占较高优先级的线程),例如SCHED_FIFO或SCHED_RR,则会发生更糟的情况.在那种情况下,较高优先级的线程可能会无限期地在tryLock()上旋转,因为拥有它的较低优先级的线程将永远不会由于可运行的较高优先级线程的存在而被唤醒.这样您甚至可以陷入僵局.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值