代码
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicBoolean;
//电话亭示例
public class TestSemaphore {
public static void main(String[] args) {
List<PhoneRoom> rooms = new ArrayList<>(); //创建五个电话亭
rooms.add(new PhoneRoom("Room 1"));
rooms.add(new PhoneRoom("Room 2"));
rooms.add(new PhoneRoom("Room 3"));
rooms.add(new PhoneRoom("Room 4"));
rooms.add(new PhoneRoom("Room 5"));
//信号量 每一个线程拿一个通行证
Semaphore s = new Semaphore(5); //5张许可证 类似于共享锁 五把锁(共享锁不是互斥锁) 五个线程同时进
class Task implements Runnable{
public void run(){
try {
//类似于共享锁
s.acquire(); //尝试拿到一个通行证(许可证) 拿不到等着(阻塞) 拿到了(过去)
} catch (InterruptedException e1) {
e1.printStackTrace();
}
for(int i = 0 ; i < rooms.size() ; i++){
PhoneRoom room = rooms.get(i);
if (room.isFree()){
room.setFree(false); //没有同步 会造成两个线程进一个电话亭的可能
System.out.println(Thread.currentThread().getName()+" entered "+room.getName()); //线程进电话亭打电话
try {
Thread.sleep(2000); //打了两分钟的电话
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" exited "+room.getName()); //该线程从电话亭中出来
room.setFree(true);
s.release(); //打完电话出来 将手里的许可证释放
return; //表示线程结束
}
}
}
}
for(int i = 1 ; i <= 10 ; i++){
Runnable task = new Task();
Thread t = new Thread(task);
t.start();
}
}
}
class PhoneRoom{
AtomicBoolean isFree = new AtomicBoolean(true); // 使用AtomicBoolean 原子操作 解决上述没有同步 会造成两个线程进一个电话亭的可能
//Boolean isFree = true;
String name;
public PhoneRoom(String name) {
super();
this.name = name;
}
public boolean isFree() {
return isFree.get();
//return isFree;
}
public void setFree(boolean flag) {
this.isFree.set(flag);
//this.isFree = isFree;
}
public String getName(){
return name;
}
}
运行结果 没截图完整
这辈子坚持与不坚持都不可怕,怕的是独自走在坚持的道路上!!!