文档章节

使用 ReentrantReadWriteLock

yaokangjun
 yaokangjun
发布于 2014/09/01 12:05
字数 301
阅读 56
收藏 0

在上一篇文章中介绍了ReentrantLock,修改为ArrayList为线程安全的方法,但是效率上如果用ReentrantReadWriteLock还是有提高的。对于写操作调用ReentrantReadWriteLock.WriteLock writeLock()方法,对于读操作调用ReentrantReadWriteLock.ReadLock  readLock()方法。当写入数据时锁定对象的写与读操作,只允许一个线程写入。当读数据时,不允许写入数据,可以允许多个线程读。

看代码吧:

package com.yao.thread;

import java.util.Arrays;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class ArrayListReentrantReadWriteLock {
	private ReadWriteLock rwLock = new ReentrantReadWriteLock();
	private int next;
	private Object[] list;
	
	public ArrayListReentrantReadWriteLock(int capacity){
		list = new Object[capacity];
	}
	
	public ArrayListReentrantReadWriteLock(){
		this(16);
	}
	
	public void add(Object obj) {
		try {
			rwLock.writeLock().lock();
			if (next == list.length) {
				list = Arrays.copyOf(list, list.length * 2);
			}
			list[next++] = obj;
		} finally {
			rwLock.writeLock().unlock();
		}
	}
	
	public Object get(int index) {
		try {
			rwLock.readLock().lock();
			return list[index];
		} finally {
			rwLock.readLock().unlock();
		}
	}
	
	public int size(){
		try {
			rwLock.readLock().lock();
			return next;
		} finally {
			rwLock.readLock().unlock();
		}
	}
}



© 著作权归作者所有

yaokangjun
粉丝 26
博文 62
码字总数 29408
作品 0
广州
程序员
私信 提问
ReentrantReadWriteLock与AtomicInteger的简单应用与对比

背景说明:   模拟春节抢票场景,500个线程(50并发)抢100张票,余票足够则成功取得票,否则不成功。 ReentrantReadWriteLock实现版: public class ReadWriteLockTest { private static fi...

zhengweihao
2015/12/08
88
0
ReentrantReadWriteLock读写锁及其在 RxCache 中的使用

一. ReentrantReadWriteLock读写锁 Lock 是相当于 synchronized 更面向对象的同步方式,ReentrantLock 是 Lock 的实现。 本文要介绍的 ReentrantReadWriteLock 跟 ReentrantLock 并没有直接的...

fengzhizi715
01/21
0
0
concurrent包 线程池、资源封锁和队列、ReentrantReadWriteLock介绍

jdk1.5后,提供了java.util.concurrent包,它可以实现线程池,你把线程当成普通对象就可以了,它来负责调度和执行 包括两类线程池 固定线程池 可变线程池 延迟线程池 固定线程池 public sta...

JavaGG
2010/03/24
975
0
Java 复习 —— 锁以及线程之间的通讯

1、Lock 1)1.5版本之后出现,java.util.concurrent.locks.Lock 2) Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的...

learn_more
2015/09/13
124
0
关于concurrent包 线程池、资源封锁和队列、ReentrantReadWriteLock介绍

jdk1.5后,提供了java.util.concurrent包,它可以实现线程池,你把线程当成普通对象就可以了,它来负责调度和执行 包括两类线程池 固定线程池 可变线程池 延迟线程池 固定线程池 public sta...

JavaGG
2009/06/11
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

Yii2中你可能忽略但很有用的两个方法batch&each

我们的数据库常常都是很庞大的,一次查询的结果集也很大,这样很浪费内存,为了降低内存的使用率,我们可以使用yii2的batch和each方法。 为了让大家看的更明白,我们模拟一个场景,然后通过y...

dragon_tech
16分钟前
1
0
ssr搭建

1. 下载shadowsocks-allwget --no-check-certificate -O shadowsocks-all.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.sh2. chmod......

吕湘颖
18分钟前
2
0
好程序员web前端干货之web前端开发框架汇总

  好程序员web前端干货之web前端开发框架汇总,其实一个前端开发框架其实就是一系列产品化的HTML/CSS/JavaScript组件的集合,我们可以在设计中使用它们。前端开发框架有很多,其中有一些写...

好程序员IT
20分钟前
1
0
打包 压缩 命令tar zip

tar语法 #压缩 tar -czvf ***.tar.gz tar -cjvf ***.tar.bz2 #解压缩 tar -xzvf ***.tar.gz tar -xjvf ***.tar.bz2  tar [主选项+辅选项] 文件或目录 主选项是必须要有的,它告诉tar要做什么...

shzwork
24分钟前
2
0
实时计算轻松上手,阿里云DataWorks Stream Studio正式发布

Stream Studio是DataWorks旗下重磅推出的全新子产品。已于2019年4月18日正式对外开放使用。Stream Studi是一站式流计算开发平台,基于阿里巴巴实时计算引擎Flink构建,集可视化拖拽DAG和SQL...

迷你芊宝宝
30分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部