這篇文章主要介紹了Java程式設計中的互斥鎖,信號量和多執行緒等待機制實例詳解,簡單介紹了互斥鎖和信號量的區別,需要的朋友可以了解下。
互斥鎖和信號量都是作業系統中為並發程式設計設計基本概念,互斥鎖和信號量的概念上的不同在於,對於同一個資源,互斥鎖只有0和1 的概念,而信號量不只如此。也就是說,信號量可以使資源同時被多個執行緒訪問,而互斥鎖同時只能被一個執行緒存取
互斥鎖在java中的實作就是ReetranLock , 在存取一個同步資源時,它的物件需要透過方法tryLock() 取得這個鎖,如果失敗,回傳false,成功回傳true。根據傳回的資訊來判斷是否要存取這個被同步的資源。看下面的例子
public class ReentranLockExample { private static int count = 0; private static ReentrantLock reentrantLock = new ReentrantLock(); static class MyThread extends Thread{ @Override public void run() { super.run(); try { while (true){ boolean result = reentrantLock.tryLock(); if (result){ System.out.println(Thread.currentThread().getName() + "get the lock success and run the syn code " + count ++); reentrantLock.unlock(); }else{ System.out.println(Thread.currentThread().getName() + "get the lock failed and run the syn code " + count); } System.out.println(Thread.currentThread().getName() + "run the asyntronized code " + count); Thread.sleep(500); } } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args){ MyThread thread1 = new MyThread(); MyThread thread2 = new MyThread(); thread1.start(); thread2.start(); } }
信號量相當於一個計數器,如果執行緒想要存取某個資源,則先要取得這個資源的訊號量,並且訊號量內部的計數器減1 ,信號量內部的計數器大於0則表示有可以使用的資源,當執行緒使用完某個資源時,必須釋放這個資源的信號量。信號量的一個作用就是可以實作指定個執行緒去同事存取某個資源。只需要在初始化 。
信號量在Java中的實作是Semaphore ,其在初始化時傳入一個整數數, 用來指定同步資源最大的同時存取量
public class SemaphoreExample { private static Semaphore semaphore = new Semaphore(2); private String lock = "lock"; private static int count = 0; static class MyThread extends Thread { @Override public void run() { super.run(); try { while (true) { semaphore.acquire(); Thread.sleep(500); System.out.println(Thread.currentThread().getName() + "get the lock success and run the syn code " + count++); semaphore.release(); Thread.sleep(500); } } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args){ MyThread thread1 = new MyThread(); MyThread thread2 = new MyThread(); MyThread thread3 = new MyThread(); thread1.start(); thread2.start(); thread3.start(); } }
CountDownLatch 實作一個等待機制,在等待與會者到達後,開始會議的使用中。 ConutDownLatch 在初始化中一個計數器,用來指定需要等待的個數。在並發程式設計中,所解決的需求就是,等待所有的執行緒到達某個點後。才開始進行下一步,有點類似開會,只有當所有的與會人員都到齊後,會議才能開始
public class CountDownLatchExample { private static CountDownLatch mCountDownLatch = new CountDownLatch(3); static class MyThread extends Thread { int awaitTime; public MyThread(int i) { this.awaitTime = i; } @Override public void run() { super.run(); try { while (true) { Thread.sleep(awaitTime); System.out.println(Thread.currentThread().getName() + "arrived " ); mCountDownLatch.countDown(); mCountDownLatch.await(); //可以指定等待时间 System.out.println(Thread.currentThread().getName() + "start meeting " ); } } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args){ MyThread thread1 = new MyThread(500); MyThread thread2 = new MyThread(1000); MyThread thread3 = new MyThread(2000); thread1.start(); thread2.start(); thread3.start(); } }
總結
以上是Java中互斥鎖信號量與多執行緒等待機制的範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。