首页 > 其他分享 >二值信号量实现互斥锁的功能

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

时间:2023-10-23 19:55:29浏览次数:50  
标签:SemaphoreUtils 信号量 互斥 MyThread ticket 二值 public

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

  • 可以实现同步

标签:SemaphoreUtils,信号量,互斥,MyThread,ticket,二值,public
From: https://www.cnblogs.com/swtaa/p/17782515.html

相关文章

  • 笔记:Qt开发之多线程同步互斥机制
    目标:了解Qt多线程开发中常用的同步互斥类,使用场景和特点 实现线程互斥和同步常用的类互斥锁:QMute、QMutexLocker条件变量:QWaitCondition信号量:QSemaphore读写锁:QReadLocker、QWriteLocker、QReadWriteLock 1,QMutex特点:QMutex是Qt框架提供的互斥锁类,用于保护共享资......
  • CyclicBarrier和CountDownLatch有什么区别?Semaphore(信号量)了解吗?
    一、CyclicBarrier和CountDownLatch有什么区别?两者最核心的区别:CountDownLatch是一次性的,而CyclicBarrier则可以多次设置屏障,实现重复利用;CountDownLatch中的各个子线程不可以等待其他线程,只能完成自己的任务;而CyclicBarrier中的各个线程可以等待其他线程二、Semaphore(信号量)Sema......
  • 多线程编程同步:Posix信号量
    信号量的定义IPC是进程间通信(interprocesscommunication)的简称。狭义上,IPC主要用于进程间;广义上,IPC可用于进程间或线程间。Posix消息队列、Posix信号量和Posix共享内存区合称为“PosixIPC”.信号量(semaphore)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段。......
  • FreeRTOS 原理 --- 互斥锁
    互斥锁相比于二值信号量,有以下特点:1、通过优先级继承,防止优先级反转2、只有互斥锁持有的线程可以释放互斥锁3、FreeRTOS提供支持递归版本的互斥锁 创建互斥锁互斥锁使用的描述符是队列的描述符,不单独定义互斥锁描述符。初始化时,指定队列的长度 pxNewQueue->uxLength 为......
  • GIL全局解释器锁、互斥锁、线程队列、进程池和线程池的使用、多线程爬取网页、协程理
    进程和线程的比较进程的开销比线程的开销大很多进程之间的数据是隔离的,但是,线程之间的数据不隔离多个进程之间的线程数据不共享----->还是让进程通信(IPC)------->进程下的线程也通信了---->队列GIL全局解释器锁(重要理论)Python在设计之初就考虑到要在主循环中,同时只有一......
  • linux 内核 ---信号量(semaphore)
    信号量使用说明(1)定义信号量structsemaphoresem;(2)初始化信号量voidsema_init(structsemaphore*sem,intval);该函数初始化信号量,并设置信号量sem的值为val。(3)获得信号量externvoiddown(structsemaphore*sem);externint__must_checkdown_interruptible(st......
  • 实验四 信号量
    使用二值信号量解决多线程售票系统数据错误问题实现代码#include<stdio.h>#include<pthread.h>#include<unistd.h>#include<semaphore.h>intticketAmout=2;//票的数量:全局变量sem_tmutex;//定义信号量mutexvoid*ticketAgent(void*arg){sem_wait(&mut......
  • 多线程编程同步:互斥锁和条件变量
    多线程同步怎样同步多个线程或多个进程的活动?为允许在线程或进程间共享数据,同步通常是必需的。而互斥锁和条件变量是同步的基本组成部分。互斥锁用于保护临界区(criticalregion),以保证任何时刻只有一个线程在执行其中的代码,或者任何时刻只有一个进程在执行其中的代码。互斥......
  • 信号量机制和pv操作
           ......
  • 同步和互斥概念
       ......