简介
重入锁:在java中有synchronized,和 lock接口下的ReentrantLock都属于重入锁
重入锁特点:锁传递,当线程中使用多个同样的锁,会传递下去。
也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。
非重入锁会造成死锁现象
例子
我们看一下线程调用例子:
public class ThreadDeepLock extends Thread{
public void set(){
System.out.println(Thread.currentThread().getId()+"set");
}
public void get(){
System.out.println(Thread.currentThread().getId()+"get");
set();
}
public void run(){
get();
}
public static void main(String[] args) {
ThreadDeepLock lock = new ThreadDeepLock();
new Thread(lock).start();
new Thread(lock).start();
new Thread(lock).start();
new Thread(lock).start();
}
}
方法调用没规律,get和set连续调用两次
synchronized的可重入锁
public class ThreadDeepLock extends Thread{
public synchronized void set(){
System.out.println(Thread.currentThread().getId()+"set");
}
public synchronized void get(){
System.out.println(Thread.currentThread().getId()+"get");
set();
}
public void run(){
get();
}
public static void main(String[] args) {
ThreadDeepLock lock = new ThreadDeepLock();
new Thread(lock).start();
new Thread(lock).start();
new Thread(lock).start();
new Thread(lock).start();
}
}
get,set交替执行。
ReentrantLock的可重入锁
使用ReentrantLock(和synchronized效果一样):
public class ThreadDeepLock extends Thread{
ReentrantLock lock = new ReentrantLock();
public void set(){
lock.lock();
System.out.println(Thread.currentThread().getId()+"set");
lock.unlock();
}
public void get(){
lock.lock();
System.out.println(Thread.currentThread().getId()+"get");
set();
lock.unlock();
}
public void run(){
get();
}
public static void main(String[] args) {
ThreadDeepLock lock = new ThreadDeepLock();
new Thread(lock).start();
new Thread(lock).start();
new Thread(lock).start();
new Thread(lock).start();
}
}