可重入锁:在一个锁的获取中,可允许多个线程获取该锁。
public class SemapDemo implements Runnable {
private Semaphore semaphore = new Semaphore(5);
@Override
public void run() {
try {
semaphore.acquire(2);
// 模拟耗时操作
Thread.sleep(2000);
System.out.println(Thread.currentThread().getId() + ":deno!");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(2);
}
}
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(20);
SemapDemo semapDemo = new SemapDemo();
for (int i = 0; i < 20; i++) {
executorService.submit(semapDemo);
}
}
}
代码中,对锁的获取可允许两个线程获取。执行可发现不停的会有两条语句刷出来。