zoukankan      html  css  js  c++  java
  • 公平锁与非公平锁

    层次: java层次

    前提: 线程等待时会被挂起,轮到他时会被唤醒

    公平锁:  新进程发出请求,如果此时一个线程正持有锁,或有其他线程正在等待队列中等待这个锁,那么新的线程将被放入到队列中被挂起。相当于一堆嗜睡的低血糖病人排队看医生,进去的病人门一关,外面的人便排队候着打瞌睡,轮到他时再醒醒进去

    非公平锁: 新进程发出请求,如果此时一个线程正持有锁,新的线程将被放入到队列中被挂起,但如果发出请求的同时该锁变成可用状态,那么这个线程会跳过队列中所有的等待线程而获得锁。相当于排队看医生,进去的病人门一关,外面的人便排队候着打瞌睡,这时新人来了,碰巧门一开,外面的人还没完全醒来,他就乘机冲了进去。

    非公平锁性能高于公平锁性能的原因:

    在恢复一个被挂起的线程与该线程真正运行之间存在着严重的延迟。相当于人从被叫醒要完全醒过来需要时间。

    假设线程A持有一个锁,并且线程B请求这个锁。由于锁被A持有,因此B将被挂起。当A释放锁时,B将被唤醒,因此B会再次尝试获取这个锁。与此同时,如果线程C也请求这个锁,那么C很可能会在B被完全唤醒之前获得、使用以及释放这个锁。这样就是一种双赢的局面:B获得锁的时刻并没有推迟,C更早的获得了锁,并且吞吐量也提高了。

    当持有锁的时间相对较长或者请求锁的平均时间间隔较长,应该使用公平锁。在这些情况下,插队带来的吞吐量提升(当锁处于可用状态时,线程却还处于被唤醒的过程中)可能不会出现。

  • 相关阅读:
    HTTP报文(转)
    批处理增加开机启动项(转)
    HTTP代理服务程序介绍(copy)
    MP3文件格式说明 (转)
    [sql] SQL Server判断对象是否存在
    MSSQL 链接远程数据库 读取并操作数据
    将无线网卡变成“无线路由器(无线AP)”
    :DOS命令大全(经典收藏)
    java 使用 poi 操纵 excel2003 经验总结
    log4j.properties的配置详解(根据网络资料整理)
  • 原文地址:https://www.cnblogs.com/yanze/p/9765287.html
Copyright © 2011-2022 走看看