您的位置:首页 > 编程语言 > Java开发

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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: