什么是信号量
为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区。临界区域是指执行数据更新的代码需要独占式执行。而信号量提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来协调进程对共享资源的访问的。
信号量是一个特殊的变量,程序对其访问都是原子操作。且只允许对其进行等待(P(sv))和发送(V(sv))操作。
信号量工作原理
由于信号量只能进行两种操作等待和发送信号。所以其行为是这样的:
P(sv): 如果sv的值大于零,就给减1:如果值为0就挂起该进程的执行
V(sv): 如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程等待sv而挂起,就给加1
生产者消费者问题
生产者消费者问题的本质,其实就是同步和互斥的问题。
同步:简明来说就是多个线程要做到一前一后。保证有序
互斥:简明来说就是对某个资源的规定,即这个资源不能同时被两个进程占用。
例如生产者占用缓冲区,往缓冲区中放产品的时候,消费者不能使用缓冲区。这时生产者和消费者就是一个互斥问题。同时,先要生产者生产产品了,然后消费者才能消费,这就是一个同步问题了。
在操作系统层面是通过两个原语完成操作。本以为在Java中只能用锁来解决。没想到看了狂神的JUC视频,发现居然Java也有信号量机制。Java真强√.
==两个同步信号量:full和empty,分别用来实现生产者和消费者的同步关系,假设缓冲区初始为10