java信号量原理semaphore
时间: 2023-04-23 08:01:19 浏览: 95
Java信号量是一种同步机制,用于控制对共享资源的访问。Semaphore(信号量)是一个计数器,用于跟踪可用资源的数量。当线程需要访问共享资源时,它必须先获取信号量。如果信号量的计数器为正,则线程可以继续访问资源,并将信号量的计数器减1。如果信号量的计数器为零,则线程必须等待,直到有可用的资源为止。当线程完成对共享资源的访问时,它必须释放信号量,这将增加信号量的计数器。Semaphore可以用于控制对任何类型的共享资源的访问,例如文件,数据库连接,网络连接等。
相关问题
java信号量线程同步
Java信号量是一种线程同步的机制,它可以用来控制同时访问某个资源的线程数量。Semaphore类是Java提供的信号量实现类,它有两个常用的方法:acquire()和release()。acquire()方法会尝试获取一个许可,如果没有许可可用,则会阻塞线程直到有许可可用。release()方法会释放一个许可,如果有阻塞的线程正在等待许可,则会选择一个线程并将其唤醒。
以下是一个使用Semaphore实现线程同步的例子:
```java
import java.util.concurrent.Semaphore;
public class MyThread implements Runnable {
private Semaphore semaphore;
private int id;
public MyThread(Semaphore semaphore, int id) {
this.semaphore = semaphore;
this.id = id;
}
@Override
public void run() {
try {
semaphore.acquire();
System.out.println("Thread " + id + " is running");
Thread.sleep(1000);
System.out.println("Thread " + id + " is done");
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(2); // 最多允许2个线程同时运行
for (int i = 0; i < 5; i++) {
new Thread(new MyThread(semaphore, i)).start();
}
}
}
```
上述代码中,Semaphore的初始值为2,表示最多允许2个线程同时运行。在run()方法中,线程首先会尝试获取一个许可,如果没有许可可用,则会阻塞线程直到有许可可用。然后线程会执行一些操作,最后释放许可。在main()方法中,创建了5个线程并启动它们。
JAVA信号量使用示例程序
以下是一个简单的Java信号量使用示例程序:
```java
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3); // 创建一个信号量,初始值为3
// 创建5个线程
for (int i = 1; i <= 5; i++) {
Thread thread = new Thread(new Worker(semaphore, i));
thread.start();
}
}
static class Worker implements Runnable {
private final Semaphore semaphore;
private final int id;
public Worker(Semaphore semaphore, int id) {
this.semaphore = semaphore;
this.id = id;
}
@Override
public void run() {
try {
semaphore.acquire(); // 等待信号量,如果信号量为0则阻塞
System.out.println("Worker " + id + " acquired semaphore");
Thread.sleep(1000); // 模拟工作
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); // 释放信号量
System.out.println("Worker " + id + " released semaphore");
}
}
}
}
```
在这个示例程序中,创建了一个初始值为3的信号量。然后创建了5个线程,每个线程都是一个Worker实例,Worker实例的构造函数中传入了信号量和线程ID。每个线程运行时,首先尝试获取信号量,如果信号量为0,则阻塞等待。如果成功获取信号量,就输出一个日志,然后模拟一秒钟的工作时间。最后释放信号量并输出一个日志。
由于信号量的初始值为3,所以前3个线程可以同时获取信号量并运行,后面的两个线程需要等待前面的线程释放信号量后才能获取。输出结果如下:
```
Worker 1 acquired semaphore
Worker 2 acquired semaphore
Worker 3 acquired semaphore
Worker 1 released semaphore
Worker 4 acquired semaphore
Worker 2 released semaphore
Worker 5 acquired semaphore
Worker 3 released semaphore
Worker 4 released semaphore
Worker 5 released semaphore
```
可以看到,前三个线程可以同时获取信号量,后面的两个线程需要等待前面的线程释放信号量后才能获取。这就是信号量的作用。