zoukankan      html  css  js  c++  java
  • 【多线程】公平锁/非公平锁、乐观锁/悲观锁

    公平锁/非公平锁(多线程执行顺序的维度)

    概念理解

    • 公平锁:加锁前先查看是否有排队等待的线程,有的话优先处理排在前面的线程,先来先得
    • 非公平所:线程加锁时直接尝试获取锁,获取不到就自动到队尾等待。

    例子

    • ReentrantLock 同时支持两种锁
    复制代码
    //创建一个非公平锁,默认是非公平锁
    
    Lock nonFairLock= new ReentrantLock();
    
    Lock nonFairLock= new ReentrantLock(false);
    
    //创建一个公平锁,构造传参true
    
    Lock fairLock= new ReentrantLock(true);
    复制代码

    适用场景

    • 更多的是直接使用非公平锁:非公平锁比公平锁性能高5-10倍,因为公平锁需要在多核情况下维护一个队列,如果当前线程不是队列的第一个无法获取锁,增加了线程切换次数。

    乐观锁/悲观锁(多线程操作共享数据的维度)

    概念理解

    • 悲观锁:假设一定会发生并发冲突,通过阻塞其他所有线程来保证数据的完整性。
    • 乐观锁:假设不会发生并发冲突,直接不加锁去完成某项更新,如果冲突就返回失败。

    例子

    • 悲观锁:Synchronized多线程同步,具有排他性,也会容易产生死锁。
    • 乐观锁:CAS机制,简单来说会有三个操作数,当前内存变量值V,变量预期值A,即将更新值B,当需要更新变量的时候,会直接将变量值V和预期值A进行比较,如果相同,则直接更新为B;如果不相同,则当前变量值V刷新到预期值中,然后重新尝试比较更新。

    适用场景

    • 乐观锁:适用于数据争用不严重/重试代价不大/需要相应速度快的场景。
    • 悲观锁:适用于数据争用严重/重试代价大的场景。
  • 相关阅读:
    Octave中的函数记录
    利用jira-python对jira项目
    通过python中xlrd读取excel表格(xlwt写入excel),xlsxwriter写入excel表格并绘制图形
    使用python的requests模块采集请求中的数据
    react+webpack+webstorm开发环境搭建
    Django中url使用总结
    通过Django中的forms类对前台的forms表单数据进行校验
    4.软件测试用例设计
    3.软件开发与测试模型
    16 IO流
  • 原文地址:https://www.cnblogs.com/itplay/p/11074998.html
Copyright © 2011-2022 走看看