不可重入锁也叫自旋锁
指当一个方法调用了锁之后,如持有本锁的另一个方法也想执行,将会进入等待。那么想要使用这个方法必须先释放锁方可调用
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();
}
}
可重入锁
指同一个线程里,持有此锁的两个方法将均会执行,不需要先释放,但是另一个持有此锁的线程必须等待锁释放后才能使用
java里,可重入锁,如 synchronized
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();
}
}
}
}
不可重入锁例子的话,如下调用
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使用时陷入while循环而等待,所以需要先将锁释放后才可使用
Linux 系统编程 学习:11-线程:线程同步
Linux 系统编程 学习:10-线程:线程的属性
Linux 系统编程 学习:9-线程:线程的创建、回收与取消
Linux 网络编程的5种IO模型:信号驱动IO模型
Linux 系统编程 学习:8-基于socket的网络编程3:基于 TCP 的通信
Linux 系统编程 学习:6-基于socket的网络编程1:有关概念
Linux 系统编程 学习:7-基于socket的网络编程2:基于 UDP 的通信
Linux 系统编程 学习:5-进程间通信2:System V IPC
Linux 系统编程 学习:2-进程间通信1:Unix IPC(1)管道
