三大经典同步问题——Java代码实现(信号量模拟)
一、代码结构说明
源码:https://github.com/986204478/Test/tree/master/synchronization/src
1、common包
①JavaSynchronizationTest.java 简单介绍了信号量机制在Java里面的实现:结合synchronized关键字和对象锁机制
/**
* PV测试:PV代码直接写的话是无法保证原子性操作的
*
* 还有Integer好像不是线程安全的
*
* 代码功能2个进程(线程)把buffer累加到20万
*
* 多线程模拟多进程
*
* @author 98620
*
*/
②然后PV.java 和Signal.java就具体实现了 信号量机制的底层操作
2、接下来的三个包就分别用不同的方法解决个对应的三个经典同步问题
3、所有源码见:github….
二、经典同步问题1—生产者消费者模型
1、实现1 Test1RecordSignal.java
/**
* @author 98620 模拟记录型信号量 解决生产者消费者问题用线程的并发来模拟进程的并发
* 注意:
* 互斥和同步信号量的原语必须成对出现。
* signal操作的次序无关紧要,但wait操作的次序不能颠倒,否则会造成死锁
*
*/
2、实现2Test2And。java
/**
* @author 98620 模拟And型信号量 解决生产者消费者问题 用线程的并发来模拟进程的并发
*/
三、经典同步问题2—哲学家进餐
1、And信号量实现 Test1And.java
2、Test2AtMostFour.java
/**
* @author 98620 最多允许4个哲学家同时拿左边的筷子 来解决哲学家进餐问题
*
*/
3、Test3OddLeft.java
/**
* @author 98620 奇数号哲学家先拿左边的筷子再拿右边,偶数相反
*
*/
四、经典同步问题3—读者写者问题
1、Test1Occupied.java
/**
* @author 98620 教材上的解法
*
* 通过阅读人数来占据写信号量:
* 如果读的人数>0那么就占据【写信号量】,如果读的人数==0那么就释放【写信号量】
*
*/
2、Test2.java
/**
* @author 98620 自定义锁机制的解法
* 读:没有人在写就可以读 否则就等待
* 写:没有人在写 且 没人在读的时候就可以写 否则就等待
*/
五、附件
<<synchronization.zip>>