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)实现的,需要显式加锁释放锁;只能用在代码块上 |
19-锁的分类
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38331606/article/details/84621230
猜你喜欢
转载自blog.csdn.net/qq_38331606/article/details/84621230
今日推荐
周排行