锁类型
可重入锁
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);解除阻塞