Java多线程同步问题:信号量示例
在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
),每个线程都尝试获取许可证来执行任务。
- 在
run
方法中,每个线程首先尝试通过acquire
方法获取许可证。如果许可证不足,线程将被阻塞,直到其他线程释放许可证。
4.一旦线程获取到许可证,它将执行任务(这里通过Thread.sleep
模拟任务执行时间)。
5.任务完成后,线程通过release
方法释放许可证,以便其他线程可以使用。
这个示例展示了如何使用信号量来控制对共享资源的并发访问,确保在任何时候都只有有限数量的线程可以访问资源。
还没有评论,来说两句吧...