二值信号量实现互斥锁的功能

信号量 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();
    }
}

  • 可以实现同步
posted @ 2023-10-23 19:49  一往而深,  阅读(35)  评论(0编辑  收藏  举报