JavaSE——線程同步

来源:http://www.cnblogs.com/linlin0/archive/2016/12/11/6159760.html
-Advertisement-
Play Games

為什麼需要線程同步? 同步就是協同步調,按預定的先後次序進行運行。如:你說完,我再說而並非一起動作。“同”字應是指協同、協助、互相配合。 如進程、線程同步,可理解為進程或線程A和B一塊配合,A執行到一定程度時要依靠B的某個結果,於是停下來,示意B運行;B依言執行,再將結果給A;A再繼續操作。 所謂同 ...


為什麼需要線程同步?  

  同步就是協同步調,按預定的先後次序進行運行。如:你說完,我再說而並非一起動作。“同”字應是指協同、協助、互相配合。 如進程、線程同步,可理解為進程或線程A和B一塊配合,A執行到一定程度時要依靠B的某個結果,於是停下來,示意B運行;B依言執行,再將結果給A;A再繼續操作。     所謂同步,就是在發出一個功能調用時,在沒有得到結果之前,該調用就不返回,同時其它線程也不能調用這個方法。按照這個定義,其實絕大多數函數都是同步調用(例如sin, isdigit等)。但是一般而言,我們在說同步、非同步的時候,特指那些需要其他部件協作或者需要一定時間完成的任務。例如Window API函數SendMessage。該函數發送一個消息給某個視窗,在對方處理完消息之前,這個函數不返回。當對方處理完畢以後,該函數才把消息處理函數所返回的LRESULT值返回給調用者。      在一般情況下,創建一個線程是不能提高程式的執行效率的,所以要創建多個線程。但是多個線程同時運行的時候可能調用線程函數,在多個線程同時對同一個記憶體地址進行寫入,由於CPU時間調度上的問題,寫入數據會被多次的覆蓋,所以就要使線程同步。 線程同步:即當有一個線程在對記憶體進行操作時,其他線程都不可以對這個記憶體地址進行操作,直到該線程完成操作, 其他線程才能對該記憶體地址進行操作,而其他線程又處於等待狀態,目前實現線程同步的方法有很多,臨界區對象就是其中一種。     在多線程編程裡面,一些敏感數據不允許被多個線程同時訪問,此時就使用同步訪問技術,保證數據在任何時刻,最多有一個線程訪問,以保證數據的完整性。        比如同一個銀行賬戶被兩個人消費,這兩個人不能同時去用這個銀行卡去付款,因為銀行卡的餘額有限,必須確認一次消費完成後確認此銀行卡的餘額還可以足夠支付下一筆消費。賬戶內的餘額相當於cpu資源,而兩筆消費相當於兩個線程,此時兩個線程是不能同時去使用cpu資源的。   線程同步的操作方法:   synchronized程式塊   synchronized方法 synchronized方法:   public synchronized run(){   }       即線上程對象的 run()方法前加上關鍵字synchronized,表示該方法是原子性的,不允許兩個線程併發執行,當一個線程的實例對象去執行該方法時,會對當前線程對象加一個同步鎖,等它執行完任務後,在把這把鎖交給另一個需要訪問這個資源的線程。    

 

 兩個線程同時使用cpu資源,會造成一些麻煩,此時應給t1線程一把鎖,給runnable 對象加上同步鎖,不要允許t2線程此時運行直到t1線程完成其工作。

此處yield()方法執行了但沒有起作用。

synchronized程式塊:

 

 持有鎖的線程以下情況會釋放鎖:

   執行完同步代碼塊;

   執行同步代碼塊的過程中發生異常導致線程終止;

   執行了鎖所屬對象的wait()方法。

註意:yield()方法和sleep()方法都不會釋放鎖。

 

 

如有不對之處望指正,謝謝

 

 

 

 

 

 

 

 

                                 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前幾天寫好了字典,又剛好重溫了KMP演算法,恰逢遇到朋友吐槽最近被和諧的詞越來越多了,於是突發奇想,想要自己實現一下敏感詞屏蔽。 基本敏感詞的屏蔽說起來很簡單,只要把字元串中的敏感詞替換成“***”就可以了。對於子串的查找,就KMP演算法就可以了。但是敏感詞這麼多,總不能一個一個地遍歷看看裡面有沒有相應 ...
  • 加上這個設置編碼格式就好了,最好在頁面也加設置下utf-8 ...
  • 根據代碼來分析鏈表的操作 eg: 1.定義一個結構體,並定義一個表頭指針 2.編寫main函數 main函數主要接收外面傳進來的參數,作出一系列操作。 l:顯示所有的名字 a:添加一個名字 d:刪除一個名字 x:退出操作 3.完善各個函數的編寫 3.1 add_one_name和add_name函數 ...
  • 設計模式(Design Patterns) ——可復用面向對象軟體的基礎 設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的, ...
  • 需求:使用IO流將一個文件的內容複製到另外一個文件中去 文件"good boy.txt"位於D盤根目錄下,要求將此文件的內容複製到c:\\myFile.txt中 代碼: import java.io.*; public classInputAndOutputFile{ public static v ...
  • An internal error occurred during: "Initializing Java Tooling".java.lang.NullPointerException ...
  • String擁有一個特殊點叫:String對象的內容不可改變! 在調用諸如String對象的replace()等方法時,不是在原Sting對象的基礎上改變對象內容,而是創建了一個新的String對象把調用的方法後返回的結果放在這個新的String對象中 代碼示例如下: String str3 = " ...
  • ... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...