java创建信号量_信号量 - SegmentFault 思否

信号量是操作系统提供给用户使用的一种机制,帮助用户进程协调使用资源,用户编程的时候可以直接调用,不必自己设计。计算机对信号量只能执行 wait和signal这两种原子(sychronized)操作,即申请和释放信号量时无法被打断。

信号量多用于进程间的同步与互斥,简单的说一下同步和互斥的意思

同步:指散步在不同任务之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。

互斥:不同任务之间的若干程序片断,当某个任务运行其中一个程序片段时,其它任务就不能运行它们之中的任一程序片段,只能等到该任务运行完这个程序片段后才可以运行

竞争:当并发进程竞争使用同一个资源的时候,我们就称为竞争进程

显然同步是一种更为复杂的互斥,而互斥是一种特殊的同步。也就是说互斥是两个任务之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行,而同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也是一种互斥)!因此互斥具有唯一性和排它性,但互斥并不限制任务的运行顺序,即任务是无序的,而同步的任务之间则有顺序关系。

对于信号量,可以认为是一个仓库,有两个概念,容量和当前的货物个数。

P操作从仓库拿货,如果仓库中没有货(if(signal==0)),线程一直等待(wait),直到V操作,往仓库里添加了货物,然后从仓库拿货(--signal)为了避免P操作一直等待下去,会有一个超时时间。

V操作,如果仓库满了(if(signal==bound)),线程等待(wait),直到有P操作,从仓库中拿走货物,有空的位置,往仓库送货(++signal)。

创建信号量,设置容量,先有V操作,才能P操作。

P操作:货物个数减1,减过之后,货物个数大于等于0,说明已经拿到货物,线程继续。否者线程阻塞。

V操作:货物个数加1,加过之后,货物个数小于等于容量,说明添加成功,线程继续。否者线程阻塞。

JDK1.5已经实现了Semaphore类,无须再自己实现。

构造函数需要指定信号量的容量,可选指定是否公平,以防止低优先级线程的饥饿状态。

Semaphore(int permits) 创建具有给定的许可数和非公平的公平设置的 Semaphore。

Semaphore(int permits, boolean fair) 创建具有给定的许可数和给定的公平设置的 Semaphore。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值