synchronized关键字虽然可以解决大部分多线程锁的问题,但是仍旧存在下述问题:
- 假如持有锁的某线程因等待长时IO或者其他原因阻塞,其他等待的线程无法响应中断,只能不断等待;
- 多线程下只有读操作是不会发生冲突的,但synchronized关键字对读和写操作均一视同仁,所以当一个线程进行读取操作时,其他线程只能不断等待;
- 使用synchronized关键字无法确认线程是否成功获取到锁。
针对上述问题,Doug Lea李大爷实现了一套更加灵活的Java锁机制,即J.U.C的locks包。
下面,我们打开locks包,看看有啥好东西吧。
首先看一下Lock接口:
Lock
Lock有下述6个方法,主要分为三大类:
- 获取锁的方法,分别为lock()、lockInterruptibly()、tryLock()、tryLock(long, TimeUnit);
- 释放锁的方法,unlock();
- 线程协作相关的方法,newCondition()。
synchronsized关键字不需要用户手动释放锁,当synchronized修饰的方法或代码块执行完毕后,系统会自动让线程释放