java模拟实现简单的读写锁
2016-05-22 00:00
477 查看
当一个文件进行读的时候,其他线程也可以进行读,但是不能写入,当一个文件进行写的时候,其他线程不能读和写。
我将使用一个数组形式的数据模拟读写的简单锁操作进行控制。
我将使用一个数组形式的数据模拟读写的简单锁操作进行控制。
package org.dyb.readwrite; public class DataHandler { private char[] buffer = "AAAAAAAAAAA".toCharArray(); private ReadWriteLock rwl = new ReadWriteLock(); public char[] read(String name) { System.out.println(name + "waiting for read ..."); rwl.readLock(); try { char[] data = doRead(); System.out.println(name + "reads data " + new String(data)); return data; } finally{ rwl.readUnlock(); } } public void write(String name,char[] data){ System.out.println(name + "waiting for write ..."); rwl.writeLock(); try { System.out.println(name + "reads data " + new String(data)); doWrite(data); }finally{ rwl.writeUnlock(); } } private char[] doRead(){ char[] ret = new char[buffer.length]; for(int i=0;i<buffer.length;i++){ ret[i] = buffer[i]; sleep(3); } return ret; } private void doWrite(char[] data){ buffer = new char[data.length]; for(int i=0;i<data.length;i++){ buffer[i] = data[i]; sleep(10); } } private void sleep(int ms) { try { Thread.sleep(ms); } catch (InterruptedException e) { e.printStackTrace(); } } }在读写的操作上进行加锁。
package org.dyb.readwrite; public class ReadWriteLock { private int readingThreads = 0; private int writingThreads = 0; private int waitingThreads = 0; private boolean preferWrite = true; public synchronized void readLock(){ while(writingThreads>0||(preferWrite&&waitingThreads>0)){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } readingThreads++; } public synchronized void readUnlock(){ readingThreads--; preferWrite = true; notifyAll(); } public synchronized void writeLock(){ waitingThreads++; while(readingThreads>0||writingThreads>0){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); }finally{ waitingThreads--; } } writingThreads++; } public synchronized void writeUnlock(){ writingThreads--; preferWrite = false; notifyAll(); } }
相关文章推荐
- java调试程序中每一步所用时间工具类
- java反射覆写toString方法实现输出实体类属性值
- 自定义spring控制反转及简单原理
- java项目经验总结之自定义异常类
- Java时间工具类
- struts导入Excel进行解析
- java简单的MySQL数据库连接增删改查
- java对于半角和全角的转换
- hibernate正向工程创建数据库createDB.java
- java读取InputStream输入流后输出String字符串
- javaweb简单实现国际化信息输出(参考)
- java事务
- Java基本类型与包装类的区别
- 对Java多态的理解
- Java Thread多线程
- spring容器初始化时报java.lang.IllegalArgumentException
- 解决eclipse每次Run as Android 程序,会重新启动一个AVD模拟器的问题
- 抽象练习、封装及javadoc使用等相关演示
- IDEA导入Maven项目(Spring+Mybatis)后登录报错:找不到对应的Dao方法
- FTP方式的文件上传和下载的Java代码