日常小结-信号量和互斥量
来源:互联网 发布: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();
异同点
简单的从概念上来似乎两者并没有特别大的区别,在使用上有些情况下也确实可以互换,但是仍然有一些区别,首先信号量强调的是控制程序流程的访问顺序上,也就是说更多的使用在同步上。而互斥量更多的是强调在资源的独占性上,更多的是锁的概念。
- 日常小结-信号量和互斥量
- 日常小结
- 日常小结
- 信号量、互斥体和自旋锁小结
- 日常小结-协议小结
- 理解互斥量和信号量
- 理解互斥量和信号量
- 理解互斥量和信号量
- 信号量和互斥量
- 理解互斥量和信号量
- 理解互斥量和信号量 .
- 互斥量和信号量
- 理解互斥量和信号量
- 理解互斥量和信号量
- 多线程 -- 信号量和互斥量
- 理解互斥量和信号量
- 理解互斥量和信号量
- 理解互斥量和信号量
- warning: LF will be replaced by CRLF in ...
- 移动端段落文本自适应设置
- 多线程的创建方法
- Leetcode 439. Ternary Expression Parser (递归,栈)
- CodeForces 725B Food on the Plane
- 日常小结-信号量和互斥量
- 简单方便的文件存储file
- Access denied for user 'root'@'localhost' (using password:YES)
- POJ 2186
- Android真正的沉浸式状态栏
- 寻找数组中唯一的数
- 第八周—小明借书
- Java反射和泛型的本质
- C语言中scanf函数与输入缓冲区