并发库:同步锁

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()
发布了70 篇原创文章 · 获赞 1 · 访问量 2271

猜你喜欢

转载自blog.csdn.net/caozp913/article/details/103465199
今日推荐