并发编程-concurrent指南-信号量Semaphore

Semaphore翻译成字面意思为 信号量,Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。

acquire()用来获取一个许可,若无许可能够获得,则会一直等待,直到获得许可。

release()用来释放许可。注意,在释放许可之前,必须先获获得许可。

下面通过一个例子来看一下Semaphore的具体使用:

假若一个工厂有5台机器,但是有8个工人,一台机器同时只能被一个工人使用,只有使用完了,其他工人才能继续使用。那么我们就可以通过Semaphore来实现:

import java.util.concurrent.Semaphore;

public class Main {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(5);//5台机器

        //8个工人工作
        for(int i=0;i<8;i++){
            new Thread(new Worker(semaphore)).start();
        }
    }
}
import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * 工人
 */
public class Worker implements Runnable{
    private Semaphore semaphore;
    public Worker(Semaphore semaphore){
        this.semaphore = semaphore;
    }

    @Override
    public void run() {
        try {
            semaphore.acquire();
            System.out.println(Thread.currentThread().getName()+"占用一个机器生产。。。");
            int random = new Random().nextInt(10);
            TimeUnit.SECONDS.sleep(random);
            System.out.println(Thread.currentThread().getName()+"释放出机器");
            semaphore.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

适用场景:

Semaphore其实和锁有点类似,它一般用于控制对某组资源的访问权限。

 

源码地址:https://github.com/qjm201000/concurrent_semaphore.git

 

转载于:https://www.cnblogs.com/qjm201000/p/10150270.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C#中,有多种方法和类可以实现并发编程,以下是一些常用的相关类和技术: 1. 多线程编程- Thread 类:用于创建和控制线程的基本类。 - ThreadPool 类:用于管理线程池,可以重用线程以提高性能。 - Task 类:用于创建和管理异步操作的任务。 - Parallel 类:提供了一组静态方法,用于并行执行循环、迭代和任务。 2. 同步和互斥: - Monitor 类:提供了一种基于锁的同步机制,用于保护共享资源的访问。 - Mutex 类:提供了一种系统级别的互斥锁,用于同步跨进程的线程访问。 - Semaphore 类:提供了一种计数信号,用于控制对特定资源的访问。 3. 并发集合: - ConcurrentQueue、ConcurrentStack、ConcurrentBag 类:线程安全的队列、栈和无序集合。 - ConcurrentDictionary 类:线程安全的字典。 4. 并行 LINQ(PLINQ):使用并行化技术对 LINQ 查询进行并行执行,提高查询性能。 5. 异步编程:使用 async/await 关键字结合 Task 和 Task<T> 类来实现异步操作,并避免阻塞主线程。 6. 并发设计模式:例如生产者消费者模式、读写锁模式、信号模式等,用于解决特定的并发编程问题。 在并发编程中,需要注意线程安全性和竞态条件等问题,使用适当的同步机制和并发类来保护共享资源的访问。此外,正确处理异常和避免死锁等问题也是并发编程中需要考虑的重要方面。 总结: C#提供了多种类和技术来实现并发编程,包括多线程编程、同步和互斥、并发集合、并行 LINQ、异步编程等。通过这些类和技术,可以有效地管理线程、保护共享资源,并提高程序的并行性和性能。在并发编程中,需要注意线程安全性和竞态条件等问题,并采用适当的设计模式和同步机制来解决这些问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值