Semaphore
使用场景:控制访问特定资源的线程数量
案例
一个通道,每次只能让两个人进入通道,其余人在外面排队等着
步骤
-
1.需要有人来管理这个通道
创建Semaphore对象
-
2.当有人进来了,发通行证
acquire()发通行证
-
3.当有人出去了,回收通行证
release()收回通行证
-
4.如果通行证发完了,那么其他人只能等着
MyRunnable类
package com.cmy.mysemaphore;
import java.util.concurrent.Semaphore;
/**
* @author 陈明勇
*/
public class MyRunnable implements Runnable {
/**
* 1.获得管理员对象
*/
private Semaphore semaphore = new Semaphore(2);
@Override
public void run() {
// 2.获得通行证
try {
semaphore.acquire();
// 3.进入通道
System.out.println(Thread.currentThread().getName() + "获得了通行证,进入通道");
Thread.sleep(2000);
// 4.归还通行证
System.out.println(Thread.currentThread().getName() + "归还通行证");
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
测试类
package com.cmy.mysemaphore;
/**
* @author 陈明勇
*/
public class Demo {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
for (int i = 0; i < 100; i++) {
new Thread(myRunnable).start();
}
}
}
测试结果
Thread-1获得了通行证,进入通道
Thread-0获得了通行证,进入通道
Thread-0归还通行证
Thread-1归还通行证
Thread-2获得了通行证,进入通道
Thread-3获得了通行证,进入通道
Thread-3归还通行证
Thread-2归还通行证
......
两两进入通道,两两归还通行证

该博客介绍了Semaphore在Java并发编程中的应用,通过一个通道仅允许两人同时进入的案例,展示了如何通过acquire()获取通行证(资源)和release()归还通行证,实现线程同步,确保资源访问的有序性。
259

被折叠的 条评论
为什么被折叠?



