读者-写者问题的读写操作限制(包括读者优先和写者优先):1)写-写互斥,即不能有两个写者同时进行写操作。2)读-写互斥,即不能同时有一个线程在读,而另一个线程在写。3)读-读允许,即可...
读者-写者问题的读写操作限制(包括读者优先和写者优先):
1) 写-写互斥,即不能有两个写者同时进行写操作。
2) 读-写互斥,即不能同时有一个线程在读,而另一个线程在写。
3) 读-读允许,即可以有一个或多个读者在读。
读者优先的附加限制:如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。
写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作
这是我的代码:
public class Test implements Runnable{
private String num;
private char name;
private int num3;
private int num4;
private static Object lock = new Object();
public static void main(String[] args) {
for(int i=1;i<8;i++){
//Random random = new Random();
Thread th=null;
String chars = "RW";
// System.out.println(chars.charAt((int)(Math.random() *2)));
Test ts = new Test(Integer.toString(i),chars.charAt((int)(Math.random() *2)), (int)(1+Math.random()*(5-1+1)),(int)(1+Math.random()*(5-1+1)));
th = new Thread(ts);
th.start();
}
}
public void run(){
try {
Thread.sleep(100);
if(name=='R'){
read();
}
else if(name == 'W'){
synchronized (lock) {
write();
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Test(String a,char b,int c ,int d){
this.num=a;
this.name=b;
this.num3=c;
this.num4=d;
}
public void read(){
try {
Thread.currentThread().setName(String.valueOf(num));
Thread.sleep(num3 * 1000);
System.out.println(Thread.currentThread().getName() + "-开始读文件");
Thread.sleep(num4 * 1000);
System.out.println(Thread.currentThread().getName() + "我正在读文件");
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + "-文件读完了");
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
public void write(){
try {
Thread.currentThread().setName(String.valueOf(num));
Thread.sleep(num3 * 1000);
System.out.println(Thread.currentThread().getName()
+ "-开始写文件");
Thread.sleep(num4 * 1000);
System.out.println(Thread.currentThread().getName()
+ "-文件写完了");
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}
只能实现写-写互斥和读-读允许,其他不行,求详解
展开