JUC锁工具

锁类型

可重入锁

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);解除阻塞
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值