java concurrent 之 Lock
java.util.concurrent.locks.Lock是一个线程同步机制,就像同步块一样。 然而,锁比同步块更灵活和更复杂。
Demo
Lock lock = new ReentrantLock();
lock.lock();
//critical section
lock.unlock();
首先创建一个锁。 那么它的lock()方法被调用。 现在锁定实例被锁定。 调用lock()的任何其他线程将被阻塞,直到锁定锁的线程调用unlock()。 最后,unlock()被调用,Lock现在被解锁,所以其他线程可以锁定它。
锁和同步块之间的主要区别
- 同步块不能保证有关等待进入线程的线程被授予访问权限的顺序。
- 您不能将任何参数传递给同步块的条目。 因此,尝试访问同步块的超时是不可能的。
- 同步块必须完全包含在单个方法中。 Lock可以在单独的方法中调用lock()和unlock()。
方法列表
lock()
lockInterruptibly()
tryLock()
tryLock(long timeout, TimeUnit timeUnit)
unlock()
如果可能,lock()方法锁定Lock实例。 如果锁定实例已被锁定,线程调用lock()将被锁定,直到锁定解除锁定。
lockInterruptibly()方法锁定,除非调用该方法的线程已被中断。 另外,如果一个线程被阻塞等待锁定通过这个方法,并且它被中断,它退出这个方法调用。
tryLock()方法会尝试立即锁定Lock实例。 如果锁定成功,则返回true,如果Lock已锁定,则返回false。 这种方法从不阻止。
tryLock(long timeout,TimeUnit timeUnit)类似于tryLock()方法,除了在放弃尝试锁定锁之前等待给定的超时时间。
unlock()方法解锁Lock实例。 通常,Lock实现只允许锁定Lock的线程调用此方法。 调用此方法的其他线程可能会导致未检查的异常(RuntimeException)。