PV操作:读者写者问题

来源:互联网 发布:淘宝开抢提醒 编辑:程序博客网 时间:2024/05/22 03:45
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;}@Overridepublic void run() {// TODO Auto-generated method stubfor (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 blocke.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;}@Overridepublic void run() {// TODO Auto-generated method stubfor (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 blocke.printStackTrace();System.out.println("lock error");}}}}
0 0
原创粉丝点击