譬如說有多個 thread 想要對同一塊記憶體變數進行讀寫時,在讀寫這塊記憶體之前,先獲得一個保護變數的 semaphore,當獲得這個 semaphore 時,其他人都不能對這塊記憶體進行讀寫,直到 semaphore 持有者釋放 semaphore 為止,在這種狀況下 semaphore 的值只有二進位的 0 或 1,稱為 binary semaphores,當受保護的資源數量大於 1 的任意數量時,稱作 counting semaphores,semaphore 常用於實作 publisher subscriber model & resource pool 中
Java Semaphore example
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; public class TestSemaphore { public static void main(String[] args) { final int CONSUMER_COUNT = 20; final int RESOURCE_COUNT = 10; final ExecutorService exec = Executors.newCachedThreadPool(); final Semaphore semaphore = new Semaphore(RESOURCE_COUNT); for (int i = 0; i < CONSUMER_COUNT; i++) { final int INDEX = i; Runnable run = new Runnable() { public void run() { try { if (!semaphore.tryAcquire(2, TimeUnit.SECONDS)) { throw new RuntimeException("timeout"); } System.out.println("Acquire:" + INDEX + " / AvailablePermits:" + semaphore.availablePermits()); Thread.sleep(1000); System.out.println("Release:" + INDEX + " / AvailablePermits:" + semaphore.availablePermits()); semaphore.release(); } catch (InterruptedException e) { } } }; exec.execute(run); } exec.shutdown(); } }
0 comments:
Post a Comment