Thread详解15:ReentrantReadWriteLock
2016-03-31 17:25
543 查看
import java.util.ArrayList; import java.util.Random; import java.util.concurrent.locks.ReentrantReadWriteLock; public class TestReentrantReadWriteLock extends Thread { private ReentrantReadWriteLock readWriteLock; private ArrayList<Integer> aList; private String name; public TestReentrantReadWriteLock(ReentrantReadWriteLock readWriteLock, ArrayList<Integer> aList, String name) { super(name); this.readWriteLock = readWriteLock; this.aList = aList; this.name = name; } @Override public void run() { super.run(); if (name.startsWith("Read")) { readWriteLock.readLock().lock(); try { for (int i = 0; i < 3; i++) { System.out.printf(Thread.currentThread().getName() + " red: [%d];\n", aList.get(0)); Thread.sleep(1000); } } catch (InterruptedException e) { e.printStackTrace(); } finally { readWriteLock.readLock().unlock(); } } if (name.startsWith("Write")) { readWriteLock.writeLock().lock(); try { for (int i = 0; i < 3; i++) { Random random = new Random(); int value = random.nextInt(100); aList.set(0, value); System.out.println(Thread.currentThread().getName() + " wrote: " + value); Thread.sleep(1000); } } catch (InterruptedException e) { e.printStackTrace(); } finally { readWriteLock.writeLock().unlock(); } } } public static void main(String[] args) { ArrayList<Integer> aList = new ArrayList<>(); aList.add(0); ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); TestReentrantReadWriteLock r1 = new TestReentrantReadWriteLock(readWriteLock, aList, "Read1"); TestReentrantReadWriteLock r2 = new TestReentrantReadWriteLock(readWriteLock, aList, "Read2"); TestReentrantReadWriteLock w1 = new TestReentrantReadWriteLock(readWriteLock, aList, "Write1"); TestReentrantReadWriteLock w2 = new TestReentrantReadWriteLock(readWriteLock, aList, "Write2"); r1.start(); r2.start(); w1.start(); w2.start(); } }
输出
Read1 red: [0]; Read2 red: [0]; Read2 red: [0]; Read1 red: [0]; Read2 red: [0]; Read1 red: [0]; Write1 wrote: 58 Write1 wrote: 63 Write1 wrote: 64 Write2 wrote: 23 Write2 wrote: 13 Write2 wrote: 70
可见,确实是读锁是并发的,交叉地在执行;写锁是同步的,串行化地在执行。然后读锁和写锁是互斥的,在同一时间,要么读,要么写,不能一边写一边读。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树