關於java實現同步的方法
什麼是執行緒同步?
當使用多個執行緒來訪問同一個資料時,非常容易出現執行緒安全問題(比如多個執行緒都在操作同一資料導致資料不一致),所以我們用同步機制來解決這些問題。
實現同步機制有兩個方法:
1。
同步程式碼塊:
synchronized(同一個資料){} 同一個資料:就是N條執行緒同時訪問一個資料。
2。
同步方法:
public synchronized 資料返回型別 方法名(){}
就是使用 synchronized 來修飾某個方法,則該方法稱為同步方法。對於同步方法而言,無需顯示指定同步監視器,同步方法的同步監視器是 this 也就是該物件的本身(這裡指的物件本身有點含糊,其實就是呼叫該同步方法的物件)通過使用同步方法,可非常方便的將某類變成執行緒安全的類,具有如下特徵:
1,該類的物件可以被多個執行緒安全的訪問。
2,每個執行緒呼叫該物件的任意方法之後,都將得到正確的結果。
3,每個執行緒呼叫該物件的任意方法之後,該物件狀態依然保持合理狀態。
注:synchronized關鍵字可以修飾方法,也可以修飾程式碼塊,但不能修飾構造器,屬性等。
實現同步機制注意以下幾點: 安全性高,效能低,在多執行緒用。效能高,安全性低,在單執行緒用。
1,不要對執行緒安全類的所有方法都進行同步,只對那些會改變共享資源方法的進行同步。
2,如果可變類有兩種執行環境,當執行緒環境和多執行緒環境則應該為該可變類提供兩種版本:執行緒安全版本和執行緒不安全版本(沒有同步方法和同步塊)。在單執行緒中環境中,使用執行緒不安全版本以保證效能,在多執行緒中使用執行緒安全版本.
執行緒通訊:
為什麼要使用執行緒通訊?
當使用synchronized 來修飾某個共享資源時(分同步程式碼塊和同步方法兩種情況),當某個執行緒獲得共享資源的鎖後就可以執行相應的程式碼段,直到該執行緒執行完該程式碼段後才釋放對該 共享資源的鎖,讓其他執行緒有機會執行對該共享資源的修改。當某個執行緒佔有某個共享資源的鎖時,如果另外一個執行緒也想獲得這把鎖執行就需要使用wait() 和notify()/notifyAll()方法來進行執行緒通訊了。
Java.lang.object 裡的三個方法wait() notify() notifyAll()
wait方法導致當前執行緒等待,直到其他執行緒呼叫同步監視器的notify方法或notifyAll方法來喚醒該執行緒。
wait(mills)方法
都是等待指定時間後自動甦醒,呼叫wait方法的當前執行緒會釋放該同步監視器的鎖定,可以不用notify或notifyAll方法把它喚醒。
notify()
喚醒在同步監視器上等待的單個執行緒,如果所有執行緒都在同步監視器上等待,則會選擇喚醒其中一個執行緒,選擇是任意性的,只有當前執行緒放棄對該同步監視器的鎖定後,也就是使用wait方法後,才可以執行被喚醒的執行緒。
notifyAll()方法
喚醒在同步監視器上等待的所有的執行緒。只用當前執行緒放棄對該同步監視器的鎖定後,才可以執行被喚醒的
本文轉自SummerChill部落格園部落格,原文連結:http://www.cnblogs.com/DreamDrive/p/4093723.html,如需轉載請自行聯絡原作者
相關文章
- [轉]關於java中的 sychronized 同步方法 與 同步塊的理解JavaZed
- 關於Java中的equals方法Java
- 關於利用go實現非同步讀寫的寫法分享Go非同步
- java關於繼承父類,需要實現父類中的構造方法Java繼承構造方法
- Java關於資料結構的實現:樹Java資料結構
- Java實現非同步呼叫Java非同步
- Java關於資料結構的實現:雜湊Java資料結構
- 初學者:關於用java實現並行Java並行
- JavaScript實現非同步的4種方法JavaScript非同步
- AES加密 – iOS與Java的同步實現加密iOSJava
- Java同步方法Java
- 關於python單例的常用幾種實現方法Python單例
- Java 面試題關於方法的重寫Java面試題
- 關於限流實現的思考
- 關於Actor模型的實現模型
- 基於rust實現的事件系統,支援同步和非同步Rust事件非同步
- 關於ORM實現ORM
- 關於forEach同步非同步的問題非同步
- Java--- 關於null的處理若干方法JavaNull
- 基於 Redis 的方式實現非同步佇列Redis非同步佇列
- 非同步 HttpContext.Current實現取值的方法非同步HTTPContext
- 關於Java的取時間方法的爭論Java
- 關於序列同步的問題
- 關於 CLAHE 的理解及實現
- 關於非同步方法中的巨集任務與微任務非同步
- 基於 SplPriorityQueue 實現的排序方法排序
- 關於call, apply, bind方法的區別與內部實現APP
- 教你如何用 Java 實現非同步呼叫Java非同步
- Java Thread實現讀寫同步 (轉)Javathread
- 關於Undo地實現
- 關於laravel 框架實現路由自動注入解決方法Laravel框架路由
- 關於java獲取本地ip的幾種方法Java
- 基於 swoole 的 websocket 服務實現狀態同步Web
- 基於RabbitMQRPC實現的主機非同步管理MQRPC非同步
- 關於sentinel LDK加密war包實現應用加密的使用方法加密
- 關於同步的一點思考-下
- 關於HP UX的時鐘同步UX
- 關於singleton的幾個實現