概念简述
重入锁简单点说就是一个线程可以重复拥有同一把锁,如下代码示例
public class TestReetrantLock { /*创建锁*/ private static Lock lock = new ReentrantLock(); public static void test() { /*第一次获取锁*/ lock.lock(); for (int i = 0; i < 10; i++) { /*第二次获取锁*/ lock.lock(); System.out.println(i); /*第一次释放锁*/ lock.unlock(); } /*第二次释放锁*/ lock.unlock(); } /*测试*/ public static void main(String[] args) { for (int i = 0; i < 2;i++){ new Thread(new Runnable() { public void run() { test(); } }).start(); } } }
哪些是重入锁
①关键字synchronized
②ReentrantLock
特点
线程获取多少次锁,那么就需要释放多少次锁,否则锁未释放,导致线程阻塞。
如下代码所示
public class TestReetrantLock { /*创建锁*/ private static Lock lock = new ReentrantLock(); public static void test() { /*第一次获取锁*/ lock.lock(); for (int i = 0; i < 10; i++) { /*第二次获取锁*/ lock.lock(); System.out.println(i); /*不对第二把锁进行释放*/ // lock.unlock(); } /*第二次释放锁*/ lock.unlock(); } /*测试*/ public static void main(String[] args) { for (int i = 0; i < 2;i++){ new Thread(new Runnable() { public void run() { test(); } }).start(); } } }
执行结果会导致线程阻塞。
总结
在线程多次使用同一把锁的时候,如果使用的关键字synchronized,则不用各位理会,锁机制交给了jvm去管理,但是如果是使用的ReentrantLock那么一定注意释放锁。