Java线程之Lock
重入锁 Java中的重入锁(即ReentrantLock)与Java内置锁一样,是一种排它锁。使用synchronized的地方一定可以用ReentrantLock代替。 重入锁需要显示请求获取锁,并显示释放锁。为了避免获得锁后,没有释放锁,而造成其它线程无法获得锁而造成死锁,一般建议将释放锁操作放在finally块里,如下所示。 123456 try{ renentrantLock.lock(); } finally { renentrantLock.unlock();} 如果重入锁已经被其它线程持有,则当前线程的lock操作会被阻塞。除了lock()方法之外,重入锁(或者说锁接口)还提供了其它获取锁的方法以实现不同的效果。 lockInterruptibly() 该方法尝试获取锁,若获取成功立即返回;若获取不成功则阻塞等待。与lock方法不同的是,在阻塞期间,如果当前线程被 打断(interrupt) 则该方法抛出InterruptedException。该方法提供了一种解除死锁的途径。 tryLock() 该方法试图获取锁,若该锁当前可用,则该方法立即获得锁并立即返回true;若锁当前不可用,则立即返回false。该方法 不会阻塞 ,并提供给用户对于成功获利锁与获取锁失败进行不同操作的可能性。 tryLock(long time, TimeUnit unit)