重入锁及实现原理

重入锁及实现原理 可重入锁从字面来理解就是可以重复进入的锁。可重入锁也叫做递归锁指的是同一线程外层函数获得锁之后内层递归函数仍然有获取该锁的代码但不受影响。在JAVA环境下ReentrantLock和synchronized都是可重入锁。synchronized是一个可重入锁。在一个类中如果synchronized方法1调用了synchronized方法2方法2是可以正常执行的这说明synchronized是可重入锁。否则在执行方法2想获取锁的时候该锁已经在执行方法1时获取了那么方法2将永远得不到执行。可重入锁在什么场景使用呢可重入锁主要用在线程需要多次进入临界区代码时需要使用可重入锁。具体的例子比如上文中提到的一个synchronized方法需要调用另一个synchronized方法时。可重入锁的实现原理是怎么样的加锁时需要判断锁是否已经被获取。如果已经被获取则判断获取锁的线程是否是当前线程。如果是当前线程则给获取次数加1。如果不是当前线程则需要等待。释放锁时需要给锁的获取次数减1然后判断次数是否为0了。如果次数为0了则需要调用锁的唤醒方法让锁上阻塞的其他线程得到执行的机会。下面是一个用synchronized实现的例子123456789101112131415161718publicclassReentrantTestimplementsRunnable {publicsynchronizedvoidget() {System.out.println(Thread.currentThread().getName());set();}publicsynchronizedvoidset() {System.out.println(Thread.currentThread().getName());}publicvoidrun() {get();}publicstaticvoidmain(String[] args) {ReentrantTest rt newReentrantTest();for(;;){newThread(rt).start();}}}整个过程没有发生死锁的情况截取一部分输出结果如下Thread-8492Thread-8492Thread-8494Thread-8494Thread-8495Thread-8495Thread-8493Thread-8493set()和get()同时输出了线程名称表明即使递归使用synchronized也没有发生死锁证明其是可重入的。