package concurrent;
import java.util.Date;
import java.util.concurrent.Semaphore;
public class WriterAndReader {
public static void main(String[] args) {
Semaphore resourceMutex = new Semaphore(1);
Semaphore readerCounterMutex= new Semaphore(1);
ReaderCount readerCount = new ReaderCount();
Semaphore priority = new Semaphore(1,true);
for(int i= 0 ; i <5; i++){
Thread thread;
if(i % 4 == 0){
thread = new Thread(new Writer(resourceMutex,priority));
}else{
thread = new Thread(new Reader(resourceMutex,readerCounterMutex,readerCount,priority));
}
thread.start();
}
}
}
class Writer implements Runnable {
Semaphore resourceMutex;
Semaphore priority;
public Writer(Semaphore resourceMutex, Semaphore priority) {
this.resourceMutex = resourceMutex;
this.priority = priority;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 100; i++) {
try {
Date date = new Date();
priority.acquire();
resourceMutex.acquire();
System.out.println("writer : " +Thread.currentThread().getName()+ " times " + i + " :"
);
resourceMutex.release();
priority.release();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("lock error");
}
}
}
}
class ReaderCount {
private int readerCount;
public ReaderCount() {
readerCount = 0;
}
public int addReader() {
++readerCount;
return readerCount;
}
public int minusReader() {
--readerCount;
return readerCount;
}
}
class Reader implements Runnable {
Semaphore resourceMutex;
Semaphore readerCounterMutex;
private ReaderCount readerCount;
Semaphore priority;
public Reader(Semaphore resourceMutex, Semaphore readerCounterMutex,
ReaderCount readerCount,Semaphore priority) {
this.resourceMutex = resourceMutex;
this.readerCounterMutex = readerCounterMutex;
this.readerCount = readerCount;
this.priority = priority;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 100; i++) {
try {
Date date = new Date();
priority.acquire();
readerCounterMutex.acquire();
if (readerCount.addReader() == 1) {
resourceMutex.acquire();
System.out.println("reader in");
}
readerCounterMutex.release();
priority.release();
System.out.println("reader : "+Thread.currentThread().getName() + " times " + i + " :"
);
readerCounterMutex.acquire();
if (readerCount.minusReader() == 0) {
System.out.println("reader out");
resourceMutex.release();
}
readerCounterMutex.release();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("lock error");
}
}
}
}
PV操作:读者写者问题
最新推荐文章于 2022-11-26 20:19:26 发布