PV操作:读者写者问题
2015-09-06 09:45
399 查看
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"); } } } }
相关文章推荐
- poj 3159 Candies (差分约束)
- 微服务架构的设计模式
- Java的进程内缓存框架:EhCache
- 反渗透设备:反渗透水处理设备应用广泛
- Struts2笔记――15.Spring的事务
- flume-ng收集windows日志笔记
- monkey学习笔记(二)
- 广泛结交而谨慎择友
- perl 中的$/
- tomcat绿色版及安装版修改内存大小的方法
- jquery基础知识实例(一)
- 图书馆Demo完成后总结
- view透明度渐变
- 反渗透设备:反渗透纯净水处理设备特点
- hdu 5430 Reflect(欧拉函数)
- R语言_Simulation
- Android createWindowSurface failed EGL_BAD_ALLOC 引起Crash的解决方案
- I2S与pcm的区别
- JqueryMobile动态生成listView并实现刷新的两种方法
- [转]为什么GOF的23种设计模式里面没有MVC?