JAVA 執行緒同步機制

2021-09-24 23:41:54 字數 1382 閱讀 3889

執行緒安全問題:

多個執行緒共享一批資料時,則會出現執行緒安全問題,看個demo

三個執行緒 同時賣100張票,此時執行則會出現執行緒安全問題,執行結果可能會出現賣重複的張數,或者賣不出現的張數。

public class runnable2 implements runnable  catch (interruptedexception e) }}

}public static void main(string args)

}

執行緒安全問題產生的原理:

重複現象是因為 當多個執行緒同時執行了system.out.println(thread.currentthread().getname()+"正在賣第"+ticket+"張票"); 此時還沒有進行 ticket--,所以會出現重複現象。

出現不該出現的張數是因為 多個執行緒同時進入if語句 當ticket--為0時,此時ticket為-1,if條件不符合,但此時還有執行緒在if語句裡面,當此執行緒再執行時就是列印出ticket為-1。

解決執行緒安全問題:

① 使用同步**塊  先建立乙個鎖物件  在編寫一同步**塊 synchronized(鎖物件)   同步中的執行緒沒有執行完畢不會釋放鎖,同步外的執行緒沒有鎖進不去同步       此方法的缺點就是會降低效率

public class runnable2 implements runnable  catch (interruptedexception e) }}

}}

}

②使用同步方法       

同步方法同樣也會把**鎖住 ,讓乙個執行緒執行 同步方法的鎖物件就是預設的實現類物件(this)

@override

public void run()

}//建立乙個同步方法

public synchronized void payticket() catch (interruptedexception e)

}

補充:使用靜態方法  此時的鎖物件不能再是 this 而是本類的class屬性

③使用lock鎖   使用lock 要比 synchronize更為靈活  首先建立乙個reentrantlock鎖物件 再在**前加上lock()方法加上鎖

最後使用unlock()方法來釋放鎖。

public class runnable3 implements runnable  catch (interruptedexception e) finally }}

}

執行緒同步機制

本週主要學習 執行緒同步機制 互斥量 讀寫鎖和條件變數 和簡單程式的實現,對執行緒同步有了進一步認識 內容如下 執行緒的基本概念,相關函式 互斥量 說明 處於標圓形框之上的線段表示相關的執行緒沒有擁有互斥量 處於圓形框中心線之上的線段表示相關的執行緒等待互斥量 處於圓形框中心線之下的線段表示相關的執...

執行緒同步機制

執行緒同步主要用於協調對臨界資源的訪問,臨界資源可以是硬體裝置 比如印表機 磁碟 檔案 記憶體 變數 陣列 佇列等 執行緒同步有4種機制 他們的主要區別在於 各同步機制詳細的功能說明如下 臨界區臨界區是一段獨佔對某些共享資源訪問的 在任意時刻只允許乙個執行緒對共享資源進行訪問。如果有多個執行緒試圖同...

執行緒同步機制

執行緒同步的四種機制 主要區別在於 適用範圍 臨界區在使用者模式下,不會發生使用者態到核心態的切換,只能用於同程序內線程間同步。其他會導致使用者態到核心態的切換,利用核心物件實現,可用於不同程序間的執行緒同步。效能 臨界區效能較好,一般只需要數個cpu週期。其他機制效能相對較差,一般需要數十個cpu...