在前面瞭解了線程的同步機制,臨界區等,瞭解了線程的兩種基本的同步機制:java
在接下來將要了解到的是更高級的同步機制,主要有如下幾種:編程
信號量(semaphore)機制是一個通用的線程同步機制,而其它幾個線程同步工具須要根據本身的應用場景選擇符合其特性的同步機制;dom
信號量機制其實就是使用一個內部計數器,當該數值大於0時,代表還有能夠訪問的共享資源,當一個線程進入到臨界區時,計數器就會減一,當數值爲0時,表示已經沒有能夠訪問的共享資源了,在有線程進來訪問將會被掛起;semaphore構造函數中能夠傳入一個數值,也能夠稱爲」許可「,當該數值爲1時,一般稱爲」binary semphore",由於只有0 和 1 ;編程語言
下面的簡單示例中展現瞭如何使用semaphores同步共享數據;ide
(1)建立一個PrintQueue函數
public class PrintQueue { private final Semaphore semaphore; public PrintQueue() { // binary semaphore this.semaphore = new Semaphore(1); } public void printJob(){ try { semaphore.acquire(); long duration=(long)(Math.random()*10); System.out.printf("%s: PrintQueue: Printing a Job during %d seconds\n", Thread.currentThread().getName(),duration); Thread.sleep(duration); } catch (InterruptedException e) { e.printStackTrace(); }finally { semaphore.release(); } } }
public class Job implements Runnable { private PrintQueue printQueue; public Job(PrintQueue printQueue) { this.printQueue = printQueue; } @Override public void run() { System.out.printf("%s: Going to print a job\n", Thread.currentThread().getName()); printQueue.printJob(); System.out.printf("%s: The document has been printed\n", Thread.currentThread().getName()); } }(3)Main
public class Main { public static void main(String[] args) { PrintQueue printQueue=new PrintQueue(); Thread[] threads = new Thread[10]; for (int i = 0; i < 10; i++) { threads[i] = new Thread(new Job(printQueue), "Thread_" + i); } for (int i = 0; i < 10; i++) { threads[i].start(); } } }