Lock锁
Lock是一个接口,提供了比 synchronized代码更好用的锁定操作,更加符合面向对象的思想。
Lock接口的一个常用实现类ReentrantLock,两个常用方法lock和unLock:
使用步骤如下:
- 创建一个ReentrantLock对象
- 在可能会出现安全问题的代码前使用lock方法获取锁
- 在代码之后使用unLock释放锁
通常要结合try…catch…finally一起使用,把unLock方法放在finally代码块中,表示无论程序是否出现异常,都会执行该方法来释放锁。否则一旦出现异常,别的线程也都进不去了。
要想实现多个线程的同步互斥的效果,他们就需要使用同一个Lock对象。
读写锁
同步锁分为读锁和写锁两种锁,如果上好了这两种锁,jvm会有如下的行为控制:
- 读锁之间不互斥(只读数据不会产生线程安全问题,不需要互斥,可以同时访问共享数据)
- 读锁和写锁之间互斥(写的时候不能读,读的时候不能写)
- 写锁和写锁之间互斥(我写的时候你不能写)
可不可以直接使用Lock锁,不推荐,因为如果都是使用Lock锁,那么就算是读,也只能一次就读一个。
总之,在读的地方上读锁,在写的地方上写锁。
ReadWriteLock rwl = new ReentrantReadWriteLock();
rwl.readLock().lock()
……读线程代码
rwl.readLock().unLock()
rwl.writeLock().lock()
……写线程代码
rwl.writeLock().unLock()