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

来源:互联网 发布:c语言其实很简单 编辑:程序博客网 时间:2024/04/30 11:39

信号量

概念

首先信号量是一种函数调用,而不是一种语言特性(如管程),也就是说只要有底层的支持就可以实现。(个人认为只要支持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
原创粉丝点击