多线程之——重入锁
重入锁 reentrantLock 和 synchronized 关键字相比的优势是他更加灵活,可以在任何需要的地方加锁或者释放锁。下面用这两种方式进行同步控制。 // 使用重入锁 public void run() { for (int j = 0; j < 100000; j++) { //lock 为 ReentrantLock 的一个实例 lock.lock(); try { i++; } finally { lock.unlock(); } } } // 使用 synchronized 关键字 public void run() { for (int j = 0; j < 100000; j++) { synchronized(lock){ i++; } } 两者都能在多线程的情况下保证数据的原子性,但是显然重入锁的方式更加灵活。此外重入锁可以响应中断,看下面的例子。 首先我们实例化两个重入锁类变量 lock1,lock2 ,然后用线程 1 先获得 lock1 的锁,再获得 lock2 的锁。线程 2 则先获得 lock2 的锁再获得 lock2 的锁。这样会导致死锁。此时我们可以中断线程 2 ,使得线程 2 释放 lock2 ,并退出,而线程 1 可以获得 lock2 的锁。这就体现了重入锁的一个优点:响应中断。 // 测试代码 import java.util