最近在看操作系统相关的内容,看到了进程通信这一块时,发现自己被信号量和信号给弄糊涂了。于是我仔细查了查资料,发现自己以前完全没弄清楚这两个概念……现在我把自己理解的东西总结一下,并用Java代码实现,给大家分享一下,如有问题,欢迎指出。
首先看信号量(Semaphore)。信号量是多线程环境下使用的一种方式,可以用来保证两个或多个程序不能同时进入临界区,从而不能同时放一个共享资源,达到进程互斥的作用。此外,通过使用信号量,我们也可以实现进程同步:在生产者消费者问题中,信号量full和empty用来保证某种事件顺序发生或者不发生,即对于一个物品,生产的过程始终要在消费的过程之前。Java的concurrent包已经实现了信号量,我们现在用它来实现生产者消费者问题,代码如下:
import java.util.concurrent.Semaphore;
//http://blog.csdn.net/sunset108/article/details/38819529
public class TestSemaphore {
static WareHouse wareHouse = new WareHouse();
//生产者
static class Producer implements Runnable {
static int num = 1;
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
wareHouse.insert(num);
System.out.println("生产物品" + num);
num++;
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//消费者
static class Consumer implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
System.out.println("消费物品" + wareHouse.remove());
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//仓库,可以放置和拿走物品
static class WareHouse {
private final int capacity = 10;
private final Semap