锁
悲观锁
- 默认数据会很容易被修改掉,所以每次在修改数据的前,先对数据进行加锁处理;并且在修改修改数据的整个过程中,都是处于加锁中。
乐观锁
- 乐观锁相对悲观锁来说,一般认为数据在修改时,是不会被外界修改,所以在访问数据时不会加锁,而是在数据真正进行修改提交时,才会对数据进行是否有差异的校验。
公平锁
- 公平锁表示获取锁的顺序是按照线程请求锁的时间早晚来决定。
非公平锁
- 非公平锁在运行时闯入,也就是先来不定先得。
独占锁
- 独占锁属于悲观锁,是指在同一时间只能有一个线程获取到该锁,并且直到该线程释放该锁前,其他的线程是获取不到该锁的。
共享锁
- 共享锁则属于一种乐观锁,允许同一时间多个线程获取该锁。
可重入锁
- 当一个线程要获取一个被其他线程持有的锁时,该线程会被阻塞,但是如果该线程再次去获取一个自己已经获取的锁,并且该线程不会被阻塞,那么该锁为可重入锁。
- 可重入锁,其实是在锁内部维护了一个线程标识,用来记录该锁是被哪个线程持有。当某个线程尝试获取该锁是,获取判断该锁内部所维护的线程是否是该线程,如果不是则阻塞挂起,如果是则将计数器+1,释放则-1,直至计数器归0。归0时,该锁中维护的线程随即修改为null,这时被阻塞挂起的线程又可以获取该锁了。
自旋锁
- 当某个线程在尝试获取锁时,因未获取到而被阻塞挂起,会涉及到用户态到内核态的切换,当获取到锁后,又会出现从内核台到用户态的切换,这里的切换开销很大,在一定程度上影响了并发的性能,所以自旋锁就来了。自旋锁是指在某个线程未获取到锁时,该线程不会立马阻塞挂起,而是在不放弃CPU使用权的情况下,进行多次尝试之后,如果还未获取到,再被阻塞挂起。(自旋锁是使用CPU的时间换取线程的调度与开销)