当线程“读取”实例的状态时,实例的状态不会改变,只有线程对实例“写入”操作时才会改变。read-write lock 模式将读取和写入分开来处理,在读取数据前获取读锁定,而写入之前,必须获取写锁定。

public class ReadWriteThreadTest {
public static void main(String[] args) {
Data data = new Data();
new ReaderThread(data).start();
new ReaderThread(data).start();
new ReaderThread(data).start();
new ReaderThread(data).start(); new WriterThread(data, "asdfghjk").start();
}
} class Data {
private final char[] buffer;
private final ReadWriteLock lock = new ReentrantReadWriteLock(); Lock read = lock.readLock();
Lock write = lock.writeLock(); public Data(int size) {
this.buffer = new char[size]; for (int i = ; i < buffer.length; i++) {
buffer[i] = '*';
}
} public char[] read() {
read.lock();
try {
return doRead();
} finally {
read.unlock();
}
} public void write(char c) {
write.lock();
try {
doWrite(c);
} finally {
write.unlock();
}
} private void doWrite(char c) {
for (int i = ; i < buffer.length; i++) {
buffer[i] = c; try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} private char[] doRead() {
char[] newbuf = new char[buffer.length];
for (int i = ; i < buffer.length; i++) {
newbuf[i] = buffer[i];
} try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
} return newbuf;
}
} class WriterThread extends Thread {
private static final Random random = new Random();
private final Data data;
private final String filter; private int index; public WriterThread(Data data, String filter) {
this.index = ;
this.data = data;
this.filter = filter;
} @Override
public void run() {
try {
while (true) {
char c = nextchar();
data.write(c);
Thread.sleep(random.nextInt());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} private char nextchar() {
char c = filter.charAt(index);
index++;
if (index >= filter.length()) {
index = ;
}
return c;
}
} class ReaderThread extends Thread{
private final Data data; public ReaderThread(Data data) {
this.data=data;
} @Override
public void run() {
while(true){
char[] readbuf = data.read();
System.out.println(Thread.currentThread().getName() + " reads " + String.valueOf(readbuf));
}
}
}

Read-Write lock 看可以,不过看的时候不能写的更多相关文章

  1. 看过《大湿教我写.net通用权限框架(1)之菜单导航篇》之后发生的事(续)——主界面

    引言 在UML系列学习中的小插曲:看过<大湿教我写.net通用权限框架(1)之菜单导航篇>之后发生的事 在上篇中只拿登录界面练练手,不把主界面抠出来,实在难受,严重的强迫症啊.之前一直在总 ...

  2. c++主程这种事情,就是这样,看人先看人品,没人品,他的能力与你何关?

    这就是人品的重要性........ 接手别人的代码,说困难,也困难,说容易也容易 想把别人代码都读通,理顺,在改原代码BUG,在完美的加功能,那项目越大,越难 想把别人代码里面,加点坑,随便找个模块, ...

  3. 写一个函数,对于一个给定的整数,如果它的二进制模式从正向看和反向看是一样的,那么返回true;

    写一个函数,对于一个给定的整数,如果它的二进制模式从正向看和反向看是一样的,那么返回true:也就是实现这样一个函数boolean isPalindrome(int x); 分析一下,该题目主要是通过 ...

  4. 零基础自学Python是看书还是看视频?

    很多人都碍于Python培训班的高昂费用和有限的空余时间都选择自学Python,但是没有老师帮助,显得有些迷茫,不知应该从何处学起,也不知识看书学习还是应该看视频学习.本就来谈谈这个话题.   我们先 ...

  5. RHEL6.3 ftp服务器参数的戏说——不看白不看,看了不白看

    大家都知道ftp服务器的应用何止广,简直就是无处不在,配置简单的ftp服务谁都会,无外乎就是刚安装好ftp服务,一启动就ok了:或是达到简单的上传下载修改下/var/ftp/pub的权限,配合配置文件 ...

  6. 发现一个好的开源项目:lomoX(挑着看,每天看一点,看一年就ok了)——用Webkit开发桌面软件,炫

    http://www.oschina.net/p/lomox https://github.com/caidongyun/lomox 用Web技术做桌面客户端.虽然仍然免不了要分发客户端,但好处是,界 ...

  7. 带着萌新看springboot源码13(手写一个自己的starter)

    springboot的最强大的就是那些xxxAutoconfiguration,但是这些xxxAutoConfiguration又依赖那些starter,只有导入了这些场景启动器(starter),我 ...

  8. BZOJ2694:Lcm——包看得懂/看不懂题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2694 Description 对于任意的>1的n gcd(a, b)不是n^2的倍数 也就是说 ...

  9. SPOJ1825/FTOUR2:Free tour II——包看得懂/看不懂题解

    http://www.spoj.com/problems/FTOUR2/en/ 题目大意:给一棵黑白染色的树,求边权和最大且经过黑点不超过K的路径. ———————————————————— 前排膜拜 ...

  10. async,await执行流看不懂?看完这篇以后再也不会了

    昨天有朋友在公众号发消息说看不懂await,async执行流,其实看不懂太正常了,因为你没经过社会的毒打,没吃过牢饭就不知道自由有多重要,没生过病就不知道健康有多重要,没用过ContinueWith就 ...

随机推荐

  1. Linux下使用java获取cpu、内存使用率

    原文地址:http://www.voidcn.com/article/p-yehrvmep-uo.html 思路如下:Linux系统中可以用top命令查看进程使用CPU和内存情况,通过Runtime类 ...

  2. Codeforces 1189A Keanu Reeves

    题目链接:http://codeforces.com/problemset/problem/1189/A 思路:统计1 和 0 的个数,不相等拆开字符串,否则不拆. AC代码: #include< ...

  3. 剑指offer——53字符流中第一个只出现一次的字符

    题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...

  4. 什么是NVMe硬盘?

    本文摘自:https://zhidao.baidu.com/question/590890784.html NVMe硬盘指的是非易失性内存主机控制器接口规范(Non-Volatile Memory e ...

  5. 2018-8-10-win10-uwp-气泡

    title author date CreateTime categories win10 uwp 气泡 lindexi 2018-08-10 19:16:50 +0800 2018-2-13 17: ...

  6. ulimit - 获取和改变用户的限制设定

    大纲 #include <ulimit.h> long ulimit(int cmd, long newlimit); 描述 警告: 这个函数已经被废弃. glibc 不再提供这个包含文件 ...

  7. linux 挂载iso文件,挂载ntfs文件系统

    映像档不可录就挂载使用.通过loop命令来执行 好吧.跟同事要了一个win10系统盘.插入,竟然是灰色的. ,一点击,提示无法挂载,仔细看了一下下面的内容,原来不支持ntfs格式,好吧,win10系统 ...

  8. 安装php 在阿里云yum源的环境

    yum -y install httpd mysql mysql-server php php-mysql postgresql postgresql-server php-postgresql ph ...

  9. [LOJ#2732] 「JOISC 2016 Day 2」雇佣计划

    参考博文 (不过个人感觉我讲的稍微更清楚一点) 题目就是让我们求图中满足数值大于等于B的连通块数量 然后我们可以尝试转换为求连通块两端所产生的“谷”的数量,显然一个连通块对谷可以贡献2的答案,最终答案 ...

  10. map方法的简单使用

    假设有一个数组a,将a中的数值以2倍的形式放到b数组中 <!DOCTYPE html> <html lang="en"> <head> < ...