0%

Java中的锁

锁的分类

可重入锁、不可重入锁

重入的意思,在获取到锁A以后,再次获取A锁。

可重入锁:synchronized, ReentrantLock, ReentrantReadWriteLock

不可重入,在获取到锁A以后,再次获取锁A之前,自己必须先释放前面加的锁。

乐观锁、悲观锁

悲观锁就是,当获取不到锁资源时,会将当前线程挂起,即进入BLOCKED或WAITING状态。

线程的挂起会涉及到用户态和内核态的切换。

用户态:JVM可以自行执行的指令。

内核态:需要操作系统才可以执行。

悲观锁:synchronized, ReentrantLock, ReentrantReadWriteLock

乐观锁:获取不到锁资源,可以再次让CPU调度,重新尝试获取锁资源。

Atomic原子类中,基于CAS乐观锁实现的。

公平锁、非公平锁

synchronized只能是非公平锁。

ReentrantLock, ReentrantReadWriteLock 可以实现公平与非公平锁。

公平锁,未获取到锁时,去排队。

非公平锁,先尝试竞争抢锁,抢不到再去排队。

互斥锁、共享锁

互斥锁:synchronized、ReentrantLock

ReentrantReadWriteLock,有互斥锁,也有共享锁。

互斥锁:同一时间点,只有一个线程持有这个锁。

共享锁:同一时间点,多个线程持有。