Semaphore(信号量-控制同时访问的线程个数)Demo

Semaphore 翻译成字面意思为 信号量,Semaphore 可以控制同时访问的线程个数,通过

acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。 Semaphore 类中比较重要的几个方法:

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

  2. public void acquire(int permits):获取 permits 个许可

  3. public void release() { } :释放许可。注意,在释放许可之前,必须先获获得许可。

  4. public void release(int permits) { }:释放 permits 个许可 上面 4 个方法都会被阻塞,如果想立即得到执行结果,可以使用下面几个方法

  5. public boolean tryAcquire():尝试获取一个许可,若获取成功,则立即返回 true,若获取失 败,则立即返回 false

  6. public boolean tryAcquire(long timeout, TimeUnit unit):尝试获取一个许可,若在指定的 时间内获取成功,则立即返回 true,否则则立即返回 false

  7. public boolean tryAcquire(int permits):尝试获取 permits 个许可,若获取成功,则立即返 回 true,若获取失败,则立即返回 false

  8. public boolean tryAcquire(int permits, long timeout, TimeUnit unit): 尝试获取 permits 个许可,若在指定的时间内获取成功,则立即返回 true,否则则立即返回 false

  9. 还可以通过 availablePermits()方法得到可用的许可数目。

`

import java.util.concurrent.Semaphore;

public class SemaphoreDemo {

public static int num = 8;


static  class Worker extends  Thread{
    private int num;
    private  Semaphore semaphore;

    public  Worker(int num,Semaphore semaphore){
        this.num=num;
        this.semaphore = semaphore;
    }
    [@Override](https://my.oschina.net/u/1162528)
    public void run(){
        try {
            semaphore.acquire();
            System.out.println("工人"+this.num+"占用一个机器在生产");
            Thread.sleep(2000);
            System.out.println("工人"+this.num+"释放了机器");
            semaphore.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public static void main(String[] args) {
    Semaphore semaphore = new Semaphore(5);
    for (int i = 1; i <num ; i++) {
        Worker ww = new Worker(i,semaphore);
        ww.start();
    }

}

} `

转载于:https://my.oschina.net/u/2246919/blog/3078345

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用 POSIX 信号量实现多个线程同时访问共享资源的例子: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #define MAX_THREADS 10 #define NUM_ITERATIONS 5 sem_t sem; // 定义信号量 int shared_resource = 0; // 共享资源 void *thread_func(void *arg) { int i; int id = *((int *) arg); for (i = 0; i < NUM_ITERATIONS; i++) { sem_wait(&sem); // 等待信号量 shared_resource++; // 访问共享资源 printf("Thread %d updated shared_resource to %d\n", id, shared_resource); sem_post(&sem); // 释放信号量 } pthread_exit(NULL); } int main(int argc, char *argv[]) { int i; pthread_t threads[MAX_THREADS]; int thread_ids[MAX_THREADS]; sem_init(&sem, 0, 1); // 初始化信号量 for (i = 0; i < MAX_THREADS; i++) { thread_ids[i] = i; pthread_create(&threads[i], NULL, thread_func, (void *) &thread_ids[i]); } for (i = 0; i < MAX_THREADS; i++) { pthread_join(threads[i], NULL); } sem_destroy(&sem); // 销毁信号量 return 0; } ``` 在上面的例子中,我们创建了多个线程,每个线程都会访问共享资源 shared_resource。为了避免多个线程同时访问该资源,我们使用了一个信号量 sem,只有获得了该信号量线程才能访问 shared_resource。在每个线程访问 shared_resource 之前,它会调用 sem_wait() 等待信号量,表示它要访问 shared_resource 了。在访问完 shared_resource 后,线程会调用 sem_post() 释放信号量,表示它已经访问完了 shared_resource,其他线程可以开始访问了。 需要注意的是,在上面的例子中,我们使用了互斥信号量,即 sem 的初始值为 1。这意味着同一时刻只有一个线程可以访问 shared_resource。如果想要多个线程同时访问 shared_resource,可以使用非互斥信号量,即将 sem 的初始值设置为大于 1 的值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值