前面学习了两种线程同步锁
1)同步方法 同步监视器为当前对象this
2)同步代码块synchronized(同步监视器/共享资源对象){ }
线程同步的第三种方法:Lock锁:对需要上锁的地方上锁
1)JDK1.5后新增的功能
2)与Synchronized相比,Lock可提供多种锁方案,更灵活
3)Java.util.concurrent.locks 中的Lock是一个接口,它的实现类是一个java类,而不是作为语言的特性(关键字)来实现
注意 :如果同步代码块有异常,要将unLock()放到finally中
(开启:Lock 关闭:unLock)
步骤:
1)创建Lock对象
2)调用lock()方法上锁
3) 调用unlock()方法解锁
Lock与synchronized的区别:
1)Lock是显示锁(手动开启和关闭,需要关闭),synchronized是隐式锁
2)Lock只有代码块锁,Synchronized有代码块锁和方法锁
3)使用Lock锁,JVM将花费较少的时间来调度线程,性能更好,并且具有更好的扩展性(提供更多的子类)
4) Lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。
如果其他线程试图进入锁定的代码,则它 将一直等待(即被阻止),直到该对象被释放。
lock()方法会 对 Lock实例对象进行加锁,因此所有对该对象调用 lock() 方法的线程都会被阻塞,直到该 Lock 对象的 unlock()方 法被调用。
写代码的