• Java中的锁


    1.可重入锁

    synchronized和Lock都是可重入锁

    表明了锁的分配机制是基于线程,而不是基于方法

    例如,在一个同步方法中调用了另一个同步方法,再进入第二个同步方法时,不需要重新申请锁

     

    2.可中断锁

    synchronized是不可中断的。

      一个线程已经获得了某对象的锁,另一个线程想获得该对象的锁时,必须等待,直到第一个线程释放锁(执行完、异常)

    Lock调用lockInterruptibly方法获得锁时,是可中断的。

      一个线程已经获得了某对象的锁,另一个线程想获得该对象的锁时,等待,在等待过程中,可以调用该线程的interrupt方法终端等待

     

    3.公平锁、非公平锁

    公平锁:按照请求的顺序获得锁

    非公平锁:不保证获取锁的顺序,吞吐量高,造成优先级反转或者饥饿现象(有的线程一直等待)

    synchronized是非公平锁

    Lock的实现类:ReentrantLock它默认情况下是非公平锁,在创建相应对象时,使用重载的构造器,传入参数(true),设置成公平锁

     

     4.共享锁、排它锁

    共享锁:锁可以被多个线程持有

    排它锁:锁只能被一个线程持有

    synchronized和Lock都是排它锁

    ReadWriteLock(读写锁),其读锁是共享锁,写锁是排它锁

      

      实现类ReentrantReadWriteLock

        

    5.乐观锁、悲观锁

    乐观锁:对同一数据的并发操作,乐观地认为不会发生修改,在更新数据的时候,尝试更新(版本)

    悲观锁:对同一数据的并发操作,悲观地认为一定会发生修改,加锁

    乐观锁:CAS

     

    6.分段锁

    分段锁是一种锁的设计(ConcurrentHashMap)

     

    7.偏向锁/轻量级锁/重量级锁

    jdk1.5引入的锁升级机制,实现高效的synchronized

    偏向锁:若同步代码之一被一个线程访问,则该线程自动获取锁

    轻量级锁:锁是偏向锁时,另一线程访问同步代码,偏向锁上升为轻量级锁,另一线程采用自旋形式获取锁,不会阻塞

    重量级锁,锁是轻量级锁时,另一线程自旋一定次数之后仍未获得锁,阻塞,轻量级锁上升为重量级锁

     

    8.自旋锁

      尝试获得锁的线程不会立即阻塞,而是采用循环的方式尝试获取锁,减少上下文切换的消耗,但是循环会消耗CPU

  • 相关阅读:
    采用软件负载均衡器实现web服务器集群
    MS Server 定时备份
    项目失败的若干征兆
    理解SQL Server中的权限体系
    项目管理思考 权利
    基于'sessionStorage'与'userData'的类session存储
    Fit健身APP与HarmonyOS创新合作 打造全新在线健身体验
    #2020征文手机#HarmonyOS轻量级偏好数据库初体验
    鸿蒙HarmonyOS应用开发落地实践,Harmony Go 技术沙龙落地北京
    【2021年1月16日公开课】分布式家庭记账本Demo分享,干货满满!
  • 原文地址:https://www.cnblogs.com/duanjiapingjy/p/9434149.html
Copyright © 2020-2023  润新知