二值信号量实现互斥锁的功能
信号量 Semaphore
的值可以理解为是可用资源的数量,当 Semaphore
=1的时候表明可用资源数为1,这和互斥锁中每次只能有一个进行可以访问临界区是一个意思,所以当 Semaphore
=1的信号量也可以用来实现互斥锁
信号量的 P V操作,和互斥锁的lock和unlock操作基本类似。只不过设置状态变成了s--,我感觉这样更容易理解,说明可用资源-1
- 信号量工具类
package com.os;
//提供互斥锁的方法
public class SemaphoreUtils {
private static int semaphore=1;//信号量初始值为1(表示可用资源=1)
private SemaphoreUtils(){};
public static void P(){
while (semaphore<=0){//说明没有资源可用
//自旋等待中
}
semaphore--;//信号量减1(标记资源用完了)
}
public static void V(){
semaphore++;//(标记资源可用)
}
}
- 线程工具类
package com.os;
//多线程售卖电影票
public class MyThread extends Thread{
private static int ticket = 1000000;//票数为100张
@Override
public void run() {
while (ticket>0){
SemaphoreUtils.P();
System.out.println("线程"+Thread.currentThread().getName()+"正在卖第"+(1000001-ticket)+"张票");
ticket--;
SemaphoreUtils.V();
}
}
}
- 测试类
package com.os;
public class SemaphoreTest {
public static void main(String[] args) {
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
MyThread myThread3 = new MyThread();
myThread1.start();
myThread2.start();
myThread3.start();
}
}
- 可以实现同步