Java多线程同步问题:信号量示例

原创 妖狐艹你老母 2024-11-08 06:30 146阅读 0赞

在Java中,信号量(Semaphore)是一种用于控制对共享资源访问的同步辅助类。它通过维护一组许可证来控制对资源的访问,每个许可证代表对资源的一个访问权。当线程需要访问资源时,它必须首先获取一个许可证;当线程访问完资源后,它必须释放许可证,以便其他线程可以使用。

下面是一个简单的Java信号量示例,演示了如何使用Semaphore来控制对共享资源的访问:

```javaimport java.util.concurrent.Semaphore;

public class SemaphoreExample {
private static final int THREAD_COUNT =5;
private static final Semaphore semaphore = new Semaphore(3); //允许同时有3个线程访问资源 public static void main(String[] args) {
for (int i =0; i < THREAD_COUNT; i++) {
new WorkerThread(“Thread-“ + i).start();
}
}

static class WorkerThread extends Thread {
public WorkerThread(String name) {
super(name);
}

@Override public void run() {
try {
//尝试获取许可证 semaphore.acquire();
System.out.println(getName() + “ 获取了许可证,开始执行任务。”);
//模拟任务执行时间Thread.sleep((long) (Math.random() *10000));
System.out.println(getName() + “任务执行完毕,释放许可证。”);
//释放许可证 semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```在这个示例中:

1.我们创建了一个Semaphore对象,初始许可证数量为3,这意味着最多可以有3个线程同时访问资源。
2.我们创建了5个线程(WorkerThread),每个线程都尝试获取许可证来执行任务。

  1. run方法中,每个线程首先尝试通过acquire方法获取许可证。如果许可证不足,线程将被阻塞,直到其他线程释放许可证。
    4.一旦线程获取到许可证,它将执行任务(这里通过Thread.sleep模拟任务执行时间)。
    5.任务完成后,线程通过release方法释放许可证,以便其他线程可以使用。

这个示例展示了如何使用信号量来控制对共享资源的并发访问,确保在任何时候都只有有限数量的线程可以访问资源。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,146人围观)

还没有评论,来说两句吧...

相关阅读