1 Lock接口
1.1 Lock与synchronized
在Lock接口出现之前,Java程序是靠synchronized关键字用来实现锁功能,使用时隐式地获取和释放锁,但是它将锁的获取和释放固化了。
所以,如果占有锁的线程由于要等待I/O或者其他原因(比如调用sleep方法)被阻塞了,其他线程就会只能一直等待,直到占有锁的线程释放掉锁,释放锁有以下几种情况:
(1)获取锁的线程执行完了该代码块,然后会自动释放锁。
(2)执行线程发生了异常,JVM会自动释放掉线程的锁。
(3)占有锁的线程进入 WAITING 状态从而释放锁,例如调用了wait()方法等。
这会极大影响程序执行效率。因此,需要有一种机制保证等待的线程不是一直处于无期限地等待的状态(解决方案:tryLock(long time, TimeUnit unit))/lockInterruptibly())。
使用synchronized的局限性还有: