读写锁
来源:互联网 发布:linux sys 编辑:程序博客网 时间:2024/04/30 08:14
本文摘自电子书
Data类
public class Data {
private final char[] buffer;
private final ReadWriteLock lock = new ReadWriteLock();
public Data(int size){
this.buffer = new char[size];
for(int i = 0;i<buffer.length;i++){
buffer[i] = '*';
}
}
public char[] read() throws InterruptedException{
lock.readLock();
try{
return doRead();
}finally{
lock.readUnlock();
}
}
public void write(char c) throws InterruptedException{
lock.writeLock();
try{
doWrite(c);
}finally{
lock.writeUnlock();
}
}
private char[] doRead(){
char[] newbuf = new char[buffer.length];
for(int i = 0;i<buffer.length;i++){
newbuf[i] = buffer[i];
}
slowly();
return newbuf;
}
private void doWrite(char c){
for(int i = 0;i<buffer.length;i++){
buffer[i] = c;
slowly();
}
}
private void slowly(){
try{
Thread.sleep(50);
}catch(InterruptedException e){
}
}
}
读线程
public class ReaderThread extends Thread{
private final Data data;
public ReaderThread(Data data){
this.data = data;
}
public void run(){
try{
while(true){
char[] readbuf = data.read();
System.out.println(Thread.currentThread().getName()+String.valueOf(readbuf));
}
}catch(InterruptedException e){
}
}
}
写线程
public class WriterThread extends Thread{
private static final Random random = new Random();
private final Data data;
private final String filler;
private int index = 0;
public WriterThread(Data data,String filler){
this.data = data;
this.filler = filler;
}
public void run(){
try{
while(true){
char c = nextchar();
data.write(c);
Thread.sleep(random.nextInt(3000));
}
}catch(InterruptedException e){
}
}
private char nextchar(){
char c = filler.charAt(index);
index++;
if(index >= filler.length()){
index = 0;
}
return c;
}
}
读写锁
public final class ReadWriteLock {
private int readingReaders = 0;//(A)...实际正在读取的线程数量
private int waitingWriters = 0;//(B)...正在等待写入的线程数量
private int writingWriters = 0;//(c)...实际正在写入的线程数量
private boolean preferWriter = true;//写入优先的话,值为true
public synchronized void readLock() throws InterruptedException{
while(writingWriters>0 || (preferWriter && waitingWriters > 0)){
wait();
}
readingReaders++;//(A)实际正在读取的线程数量加1
}
public synchronized void readUnlock(){
readingReaders--; //(A)实际正在读取的线程数量减1
preferWriter = true;
notifyAll();
}
public synchronized void writeLock() throws InterruptedException{
waitingWriters++;//(B)正在等待写入的线程数量加1
try{
while(readingReaders > 0 || writingWriters > 0){
wait();
}
}finally{
waitingWriters--;//(B)正在等待写入的线程数量减1
}
writingWriters++;//(C)实际正在写入的线程数量加1
}
public synchronized void writeUnlock(){
writingWriters--;//(C)实际正在写入的线程数量减1
preferWriter = false;
notifyAll();
}
}
测试类
public class MainReadWriteLock {
public static void main(String[] args){
Data data = new Data(10);
new ReaderThread(data).start();
new ReaderThread(data).start();
new ReaderThread(data).start();
new ReaderThread(data).start();
new ReaderThread(data).start();
new ReaderThread(data).start();
new WriterThread(data,"ABCDEFGHIJKLMNOPQRSTUVWXYZ").start();
new WriterThread(data,"abcdefghijklmnopqrstuvwxyz").start();
}
}
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- JavaScript内存空间知识点
- PHP精通 mac本地安装php环境 找不到webserver 更改php文件目录 运行
- 设置centos的ip为静态ip
- SpringMVC学习总结(三)——ModelAndView 和 Model
- 在 eclipse 环境下 @override 注解 报错
- 读写锁
- java-重载与重写
- 下起楼来我最快(java)
- IIS配置问题
- [思路题] Codeforces 377A #222 (Div. 1) A. Maze
- struts2静态方法和动态方法调用
- ssh服务器免密登录
- 前端开发工具小结
- 完整的ES6(ECMAScript6)的环境搭建(Window环境下)