题目描述:
有一个仓库,可以存放A 和B 两种产品,但要求:
(1)每次只能存入一种产品(A 或B);
(2)-N<A 产品数量-B 产品数量<M。其中,N 和M 是正整数。
试用同步算法描述产品A 与产品B 的入库过程。
思路如下:
题目中没有说仓库的大小,假设默认是无限量
每次能存放一个产品,互斥的访问仓库,设置一个仓库的互斥信号量
题目中限制(2)主要可以解毒为,相邻的连续放A的次数,连续放B的次数,两者之差要符合要求
分别设置两个信号量即可,初值分贝为A的信号量为M ,B的信号量为N
信号量A初始值-B的最小值要=M 而初始B的最小值为0,得到A信号量值为M
同理得到信号量B
比如放A要A先获取其自己信号量,成功放了后,增加B的信号量
B类似
这样的流程就能保证约束(2)
代码如下:
public class Problem_07 {
public static void main(String argv[]){
new Thread(new A()).start();
new Thread(new B()).start();
}
private static class DB{
public static final int aMaxSeqSize = 5;
public static final int bMaxSeqSize = 3;
public static Semaphore dbMutexSem = new Semaphore(1);
public static Semaphore aSeqSizeSem = new Semaphore(aMaxSeqSize);
public static Semaphore bSeqSizeSem = new Semaphore(bMaxSeqSize);
}
private static class A implements Runnable{
@Override
public void run() {
for(int loop=0; loop<10; loop++){
try {
DB.aSeqSizeSem.acquire();
DB.dbMutexSem.acquire();
System.out.printf("A\n");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
DB.dbMutexSem.release();
DB.bSeqSizeSem.release();
}
}
}
}
private static class B implements Runnable{
@Override
public void run() {
for(int loop=0; loop<10; loop++){
try {
DB.bSeqSizeSem.acquire();
DB.dbMutexSem.acquire();
System.out.printf("B\n");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
DB.dbMutexSem.release();
DB.aSeqSizeSem.release();
}
}
}
}
}