本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock。
可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。
下面的例子为非递归的例子,可重入锁也就是说加锁的主语是线程而不是方法调用
下面是使用实例
public class Test implements Runnable{
public synchronized void get(){
System.out.println(Thread.currentThread().getId());
set(); //虽然set()方法有 synchronized关键字,但是因为该线程已经获得了锁,那么仍然可以再次进入自己已经获得的锁
}
public synchronized void set(){
System.out.println(Thread.currentThread().getId());
}
@Override
public void run() {
get();
}
public static void main(String[] args) {
Test ss=new Test();
new Thread(ss).start();
new Thread(ss).start();
new Thread(ss).start();
}
}
输出结果为:
8
8
10
10
9
9
即同一个线程输出两次