JUC锁工具

    科技2024-07-27  8

    锁类型

    可重入锁

    syn关键字就是可重入的,可以在m1方法中调用m2方法.syn中可以调用syn方法

    Reentrant lock (经典消费者生产者问题)

    可重入锁,用于替换syn。但是syn是自动解锁的,Reentrant lock 需要手动解锁

    排他锁

    生产者问题与消费者问题,原本想用两把Object锁发现不行,因为wait与notify需要有锁才可以使用不然就会出错,而线程无法先确定谁先开启唤醒,唤醒如果没有wait的线程会报错

    api

    lock、unlock

    使用起来与syn相同

    trylock:尝试获取锁

    lockinterruptibly:获取一个可以被打断的锁,如被Thread.interrept中断方法,于是此线程会抛出异常,退出

    Condition produce = lock.newCondition(); produce.await();//释放锁并阻塞当前线程!!

    实现原理

    aqs

    公平锁

    讲先来后到,在队列中

    syn是非公平锁

    对比syn、reentrantlock

    sync锁升级、cas操作

    trylock

    可被打断的锁lockinterruptibly

    syn只有非公平锁、reentrant有公平与非公平的切换

    countdownlatch(门闩,时间到了门就开了)

    api

    Countdown,每次-1

    读写锁

    reentrantreadwritelock

    共享锁排他锁

    18个读,2个写线程

    读写锁效率比单纯的排他锁效率高

    lockSupport

    使用unsafe类来实现

    api

    locksupport.park:阻塞locksupport.unpark(Object);解除阻塞
    Processed: 0.015, SQL: 8