请用普通的互斥锁编程实现一个读写锁
2016-03-17 16:06
337 查看
参考
两个读取相同资源的线程是不会为彼此造成麻烦的,同样地多个线程读取相同资源的线程同时进行读操作也没有问题的。但当某个单独的线程要对资源进行写操作时,必须要求没有其他的线程在对该资源进行读操作或写操作。
两个读取相同资源的线程是不会为彼此造成麻烦的,同样地多个线程读取相同资源的线程同时进行读操作也没有问题的。但当某个单独的线程要对资源进行写操作时,必须要求没有其他的线程在对该资源进行读操作或写操作。
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; class ReadWriteLock { private volatile int reader_cnt = 0; private volatile int writer_cnt = 0; private final ReentrantLock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); public void readLock() { lock.lock(); try { while (writer_cnt > 0) { try { condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } reader_cnt++; } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void readUnlock() { lock.lock(); try { reader_cnt--; condition.signalAll(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void writeLock() { lock.lock(); try { while (writer_cnt > 0 || reader_cnt > 0) { try { condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } writer_cnt++; } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void writeUnlock() { lock.lock(); try { writer_cnt--; condition.signalAll(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } } public class Main { // private final static ReentrantReadWriteLock lock=new // ReentrantReadWriteLock(); private final static ReadWriteLock read_write_lock = new ReadWriteLock(); private static class Reader extends Thread { private int i = 0; public Reader(int i) { super(); this.i = i; } @Override public void run() { while (true) { // lock.readLock().lock(); read_write_lock.readLock(); System.out.println("i am reading" + " " + i); // lock.readLock().unlock(); read_write_lock.readUnlock(); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } private static class Writer extends Thread { @Override public void run() { while (true) { // lock.writeLock().lock(); read_write_lock.writeLock(); System.out.println("i am writing"); // lock.writeLock().unlock(); read_write_lock.writeUnlock(); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) throws InterruptedException { Thread reader1 = new Reader(1); Thread reader2 = new Reader(2); Thread writer = new Writer(); reader1.join(); reader2.join(); writer.join(); reader1.start(); reader2.start(); writer.start(); } }
相关文章推荐
- 对Python面向对象的理解
- Python (九) 协程以及数据库操作
- java IO流读写文件
- php正则字符串查找替换
- java并发库之Executors常用的创建ExecutorService的几个方法说明
- Java常见异常(Runtime Exception )小结(转)
- java socket 通信编程
- 全排列_蓝桥杯问题+一点对递归的看法
- 基于@AspectJ配置Spring AOP之一
- C++设计模式——模板方法(Template Method)
- C++使用模板并隐藏实现
- Python 解析配置模块之ConfigParser详解
- 实例讲解如何在PHP的Yii框架中进行错误和异常处理
- 贪心算法--暑假不A题 看电视(1004 problem E)
- Clojure: 实现简单的数学表达式计算
- python 刷题:替换空格
- Java中函数参数的传递是值传递还是引用传递
- python 刷题:从尾到头打印链表
- 简单python 模拟登陆
- 配置yum源 --- FTP模式