锁-概念:可重入锁可中断锁公平锁读写锁
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了锁-概念:可重入锁可中断锁公平锁读写锁相关的知识,希望对你有一定的参考价值。
可重入锁
指的是在同一个thread中,获取锁之后再次使用同样的方法或对象中的其他方法可以直接操作,而不需要重新获取锁。它是基于thread粒度的,per-thread。
不可重入锁
指的是每次使用锁方法时,都需要重新获取锁,即使在同一线程中调用同一方法都需要等待上一个锁的释放。它是基于method粒度的,per-invocation。
可重入锁与不可重复锁的例子
//设计一个锁
public class Lock{
private boolean isLocked = false;
public synchronized void lock() throws InterruptedException{
while(isLocked){
wait();
}
isLocked = true;
}
public synchronized void unlock(){
isLocked = false;
notify();
}
}
// 不可重入锁
public class Count{
Lock lock = new Lock();
public void print(){
lock.lock();
doAdd();
lock.unlock();
}
public void doAdd(){
lock.lock();
//do something
lock.unlock();
}
}
以上就是一个不可重入锁。同一线程多次调用print()方法或则doAdd()方法都会阻塞。
// 可重入锁
public class Lock{
boolean isLocked = false;
Thread lockedBy = null;
int lockedCount = 0;
public synchronized void lock()
throws InterruptedException{
Thread thread = Thread.currentThread();
while(isLocked && lockedBy != thread){
wait();
}
isLocked = true;
lockedCount++;
lockedBy = thread;
}
public synchronized void unlock(){
if(Thread.currentThread() == this.lockedBy){
lockedCount--;
if(lockedCount == 0){
isLocked = false;
notify();
}
}
}
}
以上就是一个可重入锁。只要是同一个thread获取对应的锁之后就可以重复的调用对应的方法,而不需要再次获取锁。
可中断锁
在等待获取锁过程中可中断。注意是在等待锁过程中才可以中断,如果已经获取了锁,中断就无效。
公平锁
按等待获取锁的线程的等待时间进行获取,等待时间长的具有优先获取锁权利。即按先后顺序来持有锁。
读写锁
对资源读取和写入的时候拆分为2部分处理,读的时候可以多线程一起读,写的时候必须同步地写。如:ReentrantReadWriteLock.
以上是关于锁-概念:可重入锁可中断锁公平锁读写锁的主要内容,如果未能解决你的问题,请参考以下文章
通俗易懂 悲观锁乐观锁可重入锁自旋锁偏向锁轻量/重量级锁读写锁各种锁及其Java实现!