首页 > 代码库 > Java Concurrency - ReadWriteLock & ReentrantReadWriteLock
Java Concurrency - ReadWriteLock & ReentrantReadWriteLock
锁所提供的最重要的改进之一就是 ReadWriteLock 接口和它的实现类 ReentrantReadWriteLock。这个类提供两把锁,一把用于读操作和一把用于写操作。同一时间可以有多个线程执行读操作,但只有一个线程可以执行写操作。当一个线程正在执行一个写操作,不可能有任何线程执行读操作。
public class VisitCounter { private ReadWriteLock lock; private long counter; public VisitCounter() { counter = 0; lock = new ReentrantReadWriteLock(); } public long get() { long result = -1; lock.readLock().lock(); try { // System.out.println(Thread.currentThread().getName() + "准备查询访客计数器……" + ", " + new Date()); result = queryCounter(); // System.out.println(Thread.currentThread().getName() + "查得访客计数器值为" + result + ", " + new Date()); } catch (Exception e) { e.printStackTrace(); } finally { lock.readLock().unlock(); } return result; } public void increase() { lock.writeLock().lock(); try { // System.out.println("新增访客:" + Thread.currentThread().getName() + ", " + new Date()); updateCounter(); // System.out.println(Thread.currentThread().getName() + "更新访客计数器完毕……" + ", " + new Date()); } catch (Exception e) { e.printStackTrace(); } finally { lock.writeLock().unlock(); } } private long queryCounter() throws Exception { Thread.sleep((long)(Math.random() * 10000)); return counter; } private void updateCounter() throws Exception { Thread.sleep((long)(Math.random() * 10000)); counter++; }}
正如前面提及到的,ReentrantReadWriteLock 类有两把锁,一把用于读操作,一把用于写操作。用于读操作的锁,是通过在 ReadWriteLock 接口中声明的 readLock() 方法获取的。这个锁是实现 Lock 接口的一个对象,所以我们可以使用 lock(),unlock() 和 tryLock() 方法。用于写操作的锁,是通过在 ReadWriteLock 接口中声明的 writeLock() 方法获取的。这个锁是实现 Lock 接 口的一个对象,所以我们可以使用 lock(),unlock() 和 tryLock() 方法。确保正确的使用这些锁,使用它们与被设计的目的是一样的,这是程序员的职责。当获得 Lock 接口的读锁时,不能修改变量的值。否则,可能会有数据不一致的错误。
Java Concurrency - ReadWriteLock & ReentrantReadWriteLock
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。