Read-Write Lock
2016-04-27 00:00
246 查看
摘要: 读写锁模式,写优先
Read-Write Lock
当不同操作之间会对对象临界区造成不同区别的时候,可以考虑Read-Write锁模式,就是操作中有些会改变有些不会改变(有点绕,但只要理解了的应该可以懂)。
因为是写优先,所以读查看有时候会等待。
最关键的:
为了解决的就是两个冲突问题: 1.读写冲突 2.写写冲突
在获取读锁情况下会发生的情况,在获取写锁会发生的情况。只要理清楚,就知道怎么写了。
这个模式适合的是既有写操作又有读操作,而且读操作比写操作频繁,甚至读操作还是比较费时间的情况下,因为不费时间,还不如single thread execution。
Read-Write Lock
当不同操作之间会对对象临界区造成不同区别的时候,可以考虑Read-Write锁模式,就是操作中有些会改变有些不会改变(有点绕,但只要理解了的应该可以懂)。
//读线程,共享Data public class ReaderThread extends Thread { private final Data data; public ReaderThread(Data data) { this.data = data; } public void run() { try { while (true) { char[] readbuf; readbuf = data.read(); System.out.println(getName() + String.valueOf(readbuf)); } } catch (InterruptedException e) { } } }
//写线程 public class WriterThread extends Thread{ 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); sleep(1500); } }catch(InterruptedException e){ } } private char nextchar(){ char c=filler.charAt(index); index++; if(index>=filler.length()){ index=0; } return c; } }
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 < size; i++) { buffer[i] = '*'; } } public char[] read() throws InterruptedException { lock.readLock(); try { return doRead(); } finally { lock.readUnlock(); } } private char[] doRead() { char[] newbuf = new char[buffer.length]; for (int i = 0; i < buffer.length; i++) { newbuf[i] = buffer[i]; } slowly(); return newbuf; } public void write(char c) throws InterruptedException { lock.writeLock(); try { doWrite(c); } finally { lock.writeUnlock(); } } public 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 ReadWriteLock { private int readingReaders = 0; private int waitingWriters = 0; private int writingWriters = 0; private boolean preferWriter = true; public synchronized void readLock() throws InterruptedException { while (writingWriters > 0 || (preferWriter && waitingWriters > 0)) { wait(); } readingReaders++; } public synchronized void readUnlock() { readingReaders--; preferWriter = true; notifyAll(); } public synchronized void writeLock() throws InterruptedException { waitingWriters++; try { while (readingReaders > 0 || writingWriters > 0) { wait(); } } finally { waitingWriters--; } writingWriters++; } public synchronized void writeUnlock(){ writingWriters--; preferWriter=false; notifyAll(); } }
因为是写优先,所以读查看有时候会等待。
最关键的:
private int readingReaders = 0;//正在读的数量 private int waitingWriters = 0;//等待写的数量 private int writingWriters = 0;//正在写的数量 private boolean preferWriter = true;//是否写优先
为了解决的就是两个冲突问题: 1.读写冲突 2.写写冲突
在获取读锁情况下会发生的情况,在获取写锁会发生的情况。只要理清楚,就知道怎么写了。
这个模式适合的是既有写操作又有读操作,而且读操作比写操作频繁,甚至读操作还是比较费时间的情况下,因为不费时间,还不如single thread execution。
相关文章推荐
- Linux系统负载LoadAverage详解
- Mysql外键约束foreign key
- MySql查询 SELECT
- UML类图几种关系的总结
- 解决Eclipse 启动后总是Building WorkSpace(sleeping)
- UITabBarController的使用
- 解决ubuntu中使用vi命令时方向键与退格键出错的问题
- guava 并发
- Guava学习笔记:EventBus
- python 解析unicode编码的字符串
- PHP 学习笔记 - - - 简单方法的使用 (数组)
- find_if
- 这些ABBYY FineReader中的小技巧你了解不?
- 怎么实现iMindMap中的插入功能的快速运用
- Head First C 第十二章 线程 平行世界
- SpringMvc与Struts2的对比,孰优孰劣
- zookeeper学习笔记-基本用法进阶
- Unity 换装
- 数据库中的锁
- Nginx+Tomcat实现动静分离