# 并发问题中涉及到的锁(LOCK)概念一览
## 互斥锁和共享锁
- 互斥锁(Mutex):只允许同一时间有一个或零个进程获得该锁。
- 共享锁:允许同一时间有不限个数的进程获得该锁。往往仅在对同一个资源设置了不同类型的锁时才有效果——即同一个共享锁可以同时被多个进程获得,但此时任何其他的锁(不论是不是共享锁)都无法被任何进程获得。常用于实现读写锁中的读锁(而写锁是互斥锁,且除了排斥自身外,也排斥读锁)。
互斥锁在不仅允许唯一一个进程,而允许有限个进程同时使用时,进化为信号量(Semaphore),此时不同进程往往使用的是相同类型的不同资源实例。
## 可重入锁
可重入锁,也叫做递归锁,是指在一个线程中可以多次获取同一把锁,比如:一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法【即可重入】,而无需重新获得锁
## 阻塞锁和非阻塞锁和自旋锁
即遇到资源忙情况时,资源申请的不同逻辑:
- 阻塞锁会在申请资源失败时使进程进入该资源专用的阻塞队列,在资源被释放时从阻塞队列中出一个进程批准申请,直至队列空为止
- 自旋锁则不管资源的阻塞和申请,只要一个进程申请不到资源,就会一直忙等,不断循环申请。
- 非阻塞锁会在申请资源失败时直接返回异常值,没有自旋也没有阻塞,以允许程序继续处理下面的流程。即在资源忙时,非阻塞锁只相当于做了一次询问。
## 公平锁和非公平锁
- 公平锁:每个线程获取锁的顺序是按照线程访问锁的先后顺序获取的,最前面的线程总是最先获取到锁。
- 非公平锁:每个线程获取锁的顺序是随机的,并不会遵循先来先得的规则,所有线程会竞争获取锁。
## 悲观锁和乐观锁
- 狭义的“锁”都是悲观锁,即在资源使用前必须占有对应的锁。为什么叫悲观?因为都“假设有人会给我改数据”
- 乐观锁扩展了锁的概念,提出“假设没人会改数据”“真有人改我就放弃再重试”的策略,因此不给资源加任何具有互斥性质的锁,而是仅在每次操作具体资源时验证该资源未出现非预期的修改,是一种“延迟数据同步机制”(我起的)