併發程式設計 多執行緒(實現同步)二

2021-10-10 10:43:10 字數 1611 閱讀 1384

當多個執行緒同時共享,同乙個全域性變數或靜態變數,做寫的操作時,可能會發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。

使用多執行緒之前的同步或者使用鎖(lock)

原理:將可能傳送資料衝突問題,只能讓當前乙個執行緒進行。**執行完成後釋放鎖,然後讓其它執行緒執行。

執行緒之前同步:當多個執行緒共享同乙個資源時,不會受到其它執行緒的干擾。

同步**塊就是將可能發生執行緒安全問題的**,用synchronized給括起來。

synchronized(同乙個資料)

同步函式用的是this鎖

方法上加上static關鍵字,使用synchronized 關鍵字修飾 或者使用類.class檔案。

靜態的同步函式使用的鎖是  該函式所屬位元組碼檔案物件

可以用 getclass方法獲取,也可以用當前  類名.class 表示。

總結:synchronized修飾方法使用鎖是當前this鎖。

synchronized修飾靜態方法使用鎖是當前類的位元組碼檔案

死鎖:同步中巢狀同步,導致鎖無法釋放。

例如執行緒1拿到了a鎖,等待b鎖時執行任務,執行緒2拿到了b鎖,等待a鎖執行任務,這時候兩個執行緒都佔據了對方所需要的鎖,而鎖又是在任務完成後才會自動釋放,這時候就卡住了導致死鎖。

lock介面提供了與synchronized關鍵字類似的同步功能,但需要在使用時手動獲取和釋放鎖。

lock lock  = new reentrantlock();

lock.lock();

tryfinally

lock介面可以嘗試非阻塞地獲取鎖當前執行緒嘗試獲取鎖。如果這一時刻鎖沒有被其他執行緒獲取到,則成功獲取並持有鎖。

*lock介面能被中斷地獲取鎖synchronized不同,獲取到鎖的執行緒能夠響應中斷,當獲取到的鎖的執行緒被中斷時,中斷異常將會被丟擲,同時鎖會被釋放。

lock介面在指定的截止時間之前獲取鎖,如果截止時間到了依舊無法獲取鎖,則返回。

condition的功能類似於在傳統的執行緒技術中的,object.wait()object.notify()的功能

condition condition = lock.newcondition();

res. condition.await(); 類似wait

res. condition. signal() 類似notify

同步,多執行緒 ,多執行緒方式實現併發。

io請求幾乎不佔cpu的。同步請求相當於排隊買東西,乙個卡主了,其他的都結不了賬了。執行緒並不是越多越好,如果他特別多還不如同步高,所以對執行緒要有個限制,所以就出現了執行緒池,執行緒池在python3裡才有的,python2裡沒有的。建立程序的話是耗費很多資源的,建立執行緒是幾乎不耗費資源的。建立...

多執行緒 併發 同步

對比同步塊和同步方法,理解一下同步塊可以力度更小的鎖定資源。在力度更小的鎖定資源時我們盡可能的提公升它的效能。package com.sxt.syn 執行緒安全 在併發時保證資料的正確性 效率盡可能高 synchronized 1 同步方法 2 同步塊 public class synblockte...

多執行緒 16 併發同步

併發 同乙個物件多個執行緒同時操作,比如購買同一車次票。一定涉及到併發就會導致資料不準確問題,比如同一張票被多個人買到了,這稱為執行緒不安全。那怎麼使執行緒安全呢,比如只一台電腦,大家都想用怎麼辦,排隊。跟據演算法誰先用誰後用,保證乙個 人上來用,其他人等著,等這個人用完了下一人用,還是用乙個時間點...