1 | 独占锁 | 一个线程获得了锁,其他线程就不能获取该锁 |
Synchronized是独占锁 | ||
共享锁 | 多个线程之间可以共享同一个锁,但是线程的数量是有限定的 | |
Semaphore ReadWriteLock | ||
2 | 可重入锁 | 在线程已经获得了锁的情况下,执行代码需再次获取同一个锁,可以获取成功。 |
synchronized,lock均为可重入锁 | ||
不可重入锁 | 一个线程获取对象锁之后,就不可以再次获取该对象上的锁,必须先释放锁才能调用 | |
又名自旋锁 | ||
3 | 公平锁 | 尽量以请求锁的顺序来获取锁。 |
ReentrantLock.FairSync new ReentrantLock(true) ReentrantReadWriteLock.FairSync new Semaphore(2, true) | ||
非公平锁 | 就是不排队,都去结账,谁抢到了位置(获取到锁),谁就去结账(执行代码) | |
ReentrantLock.NonfairSync new ReentrantLock()默认为非公平锁 ReentrantReadWriteLock.NonfairSync new Semaphore(2) Synchronized | ||
4 | 悲观锁 | 认为数据总会被外界修改;故在整个数据处理过程中,需将数据处于锁定状态。 |
Lock synchornized Semaphore | ||
乐观锁 | 认为数据不会被外界修改,故不采用锁进行处理。大多是基于数据的版本Version记录实现的。还有CAS协议来处理 | |
CAS volatile | ||
5 | 可中断锁 | 当锁开始运行后,可被外界中断。 |
lock.lockInterruptibly();方式添加的锁属于可中断锁 | ||
不可中断锁 | 当锁开始运行后,不可被外界中断。 | |
Synchronized | ||
6 | 读锁 | 读读锁之间不会相互等待 |
ReentrantReadWriteLock.readLock() | ||
写锁 | 写写,写读之间会相互等待 | |
ReentrantReadWriteLock.writeLock() | ||
7 | 内置锁 | synchronized是由jvm内部实现的。不需要手动关闭锁;可用在方法以及代码块 |
显式锁 | ReentrantLock是通过java api(AQS)实现的,需要显式加锁释放锁;只能用在代码块上 |