基于Semaphore的特点,如果将信号量初始化为1,使得它在使用时最多只有一个可用的许可,从而可用作一个相互排斥的锁。
下面将使用Semaphore来实现买票的例子,可参考《同步之synchronized关键字》以了解该问题。
package com.gk.thread.mutex.semaphore;
import java.util.concurrent.Semaphore;
public class Test {
public static void main(String[] args) {
Semaphore sp = new Semaphore(1); // 设置1个许可,从而可用作一个相互排斥的锁。
Runnable r = new SellTicket(sp);
new Thread(r, "窗口1").start(); // 匿名对象
new Thread(r, "窗口2").start();
new Thread(r, "窗口3").start();
}
}
package com.gk.thread.mutex.semaphore;
import java.util.concurrent.Semaphore;
public class SellTicket implements Runnable {
private int tickets = 18;
private Semaphore sp;
public SellTicket(Semaphore sp) {
this.sp = sp;
}
@Override
public void run() {
while(true) {
try {
sp.acquire(); // 获取许可
if(tickets > 0) {
System.out.println(Thread.currentThread().getName() + "正在出票... " + tickets--);
}else {
break;
}
Thread.sleep(1 * 100); // 为了更真实的模拟现实情况,每卖出一张票就停止100毫秒
} catch (InterruptedException e) {
throw new RuntimeException(e);
}finally {
sp.release(); // 释放许可
}
}
}
}
可以看出Semaphore也可实现与synchronized与Lock相似的功能。