日常小结-信号量和互斥量

信号量

概念

首先信号量是一种函数调用,而不是一种语言特性(如管程),也就是说只要有底层的支持就可以实现。(个人认为只要支持CAS就可以实现)。
信号量初始化的时候会给出一定的值,这个值决定了同时可以有几个访问对象。通常来说是1,也就是同时只能有一个访问对象。
信号量为非负整数。在执行down操作的时候讲信号量减1,如果信号量本身为0,减一则进行阻塞,直到有其他线程操作信号量up才进行判断是否唤醒。在执行up操作的时候信号量增1,up操作不会产生任何阻塞,有可能会将一个阻塞的线程唤醒,但只唤醒一个。

java中的使用

java.util.concurrent.Semaphore

Semaphore semaphore = new Semaphore(1);
try {
    semaphore.acquire();
    //semaphore.tryAcquire();
} catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
semaphore.release();

Semaphore有一个acquire()会被阻塞,如果阻塞过程中被中断了就会抛出异常,另一个tryacquire()会不会阻塞而是返回boolean来判断是否获取锁。release()方法用来进行up操作。Semaphore还提供了一些其他操作,详见API

互斥量

概念

互斥量可以视为一种简化版本的信号量,只有0和1两种状态,加锁则减一相当于信号量down操作,当互斥量本身为0的时候阻塞,当解锁的时候相当于信号量up操作,有可能唤醒一个阻塞的线程。

java的实现

如果将互斥量看成锁的话那java里有很多方式实现。总的来说分为Lock相关的实现和synchronized实现,忽略volatile。关于两者的异同以后再做分析。总的来说synchronized是管程,从语言上保证同步,可以使得每个java对象都可以作为锁,并将锁的实现托管给虚拟机,而lock则是编程人员自己实现锁,操作上更为灵活,对不同的情况也可以分开来处理。这里就先使用lock相关的类做一个简单的demo。

ReentrantLock lock = new ReentrantLock();
lock.lock();
System.out.println("do something");
lock.unlock();

异同点

简单的从概念上来似乎两者并没有特别大的区别,在使用上有些情况下也确实可以互换,但是仍然有一些区别,首先信号量强调的是控制程序流程的访问顺序上,也就是说更多的使用在同步上。而互斥量更多的是强调在资源的独占性上,更多的是锁的概念。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值