灵活性:
- public class ReentrantLockTest implements Runnable {
- public static ReentrantLock lock = new ReentrantLock();
- public static int flag = 0;@Override public void run() {
- for (int i = 0; i < 10000000; i++) {
- lock.lock();
- try {
- flag++;
- } finally {
- lock.unlock();
- }
- }
- }
- public static void main(String args[]) throws InterruptedException {
- ReentrantLockTest test = new ReentrantLockTest();
- Thread first = new Thread(test);
- Thread second = new Thread(test);
- first.start();
- second.start();
- first.join();
- second.join();
- System.out.println(flag);
- }
- }
在 lock.lock(); 这里, 通过重入锁保护临界区安全, 以免发生线程安全问题
在 lock.unlock(); 这里, 必须手动指示释放锁的操作, 否则其他线程将无法获得
在这段代码里, 我们能见到重入锁灵活的特点但为什么叫重入呢?
看下段代码:
- @Override public void run() {
- for (int i = 0; i < 10000000; i++) {
- lock.lock();
- lock.lock();
- try {
- flag++;
- } finally {
- lock.unlock();
- lock.unlock();
- }
- }
- }
因为该锁能反复进进出出但要注意一下:
在上段代码中, 锁是可以重复获取的如果不允许, 则该线程在第二次获取锁时会和自己产生死锁问题同时也要注意, 线程获取多少次锁就要释放多少此锁当获取锁的次数大于释放锁的次数相当于该线程还持有锁当获取锁的次数少于释放锁的次数则会得到一个
java.lang.IllegalMonitorStateException
异常
来源: https://juejin.im/post/5a7a6e43f265da4e7c186cc7