併發程式設計第一天

2021-09-25 14:56:16 字數 2543 閱讀 9374

synchronized修飾的地方

1. 修飾物件,就是,新建乙個物件,修飾她,這樣每一次執行syschronized包裹的**塊,必須取得拿

到物件鎖然後才可以執行這個**塊

2. 修飾公共的方法,這個鎖的擁有者就是thsi,就是這個類的例項

3. 修飾靜態的方法,這個所得擁有者就是test.class

髒讀

1. 同步方法,與不同步方法會同時進行,不會相互影響.

!(2. 讀寫不同步會產生髒讀現象,怎樣避免,需要開啟兩個執行緒,乙個是讀乙個是寫,還要給兩個方法新增

synchronized

public class test1 catch (interruptedexception e)

this.balance = balance;

}public synchronized double getbalance(string name)

public static void main(string args) throws interruptedexception

}).start(); }}

這就是乙個典型的髒讀現象,如果我們沒有在getbalance()新增synchronized修飾,那麼顯示的結果為

!!!!!00000,如果我們新增鎖,在呼叫getbalance(),則沒有任何障礙,直接調出.顯示結果為,!!!!(過十秒)

100

死鎖

兩個執行緒使用同乙個物件鎖,就會產生死鎖,比如,執行緒曼昆執行時,呼叫a方法,等待十秒鐘,執行b方法

執行緒長春,先執行b方法,等待十秒鐘,執行a方法,這樣就會陷入死鎖狀態

具有重入性

1. a,b方法均有鎖,執行緒曼昆,執行a方法時,曼昆獲得物件鎖,在曼昆執行緒裡面需要執行b方法,能執行嗎

?答案是可以的,synchronized具有重入性,只要是同乙個執行緒在他執行的階段他可以多次獲得他曾經獲得

過的物件鎖

2. 子類中的synchronized方法,呼叫父類中的synchronized方法,

也是可以的,不會造成死鎖的

鎖會被釋放

1. 程式在執行過程中,如果出現異常,預設情況下鎖會被釋放,所以在

併發處理的過程中,有異常要多加小心,可能這個執行緒處理一半的資料遇到了異常,鎖釋放了,那麼其他的執行緒可能就會開啟,這時候其他執行緒擁有的資料就是一半的資料,十分的不安全.怎樣避免這種情況??

丟擲異常就可以了,繼續執行**!!

volatile

當volatile修飾的變數,當變數修改了之後,會通知所有使用的該變數的執行緒,這個變數已經過期了,需要來主線程來讀一下.

需要了解一下jmm,每乙個執行緒都有乙個類似快取區的東西存在,當從主線程中取得a值之後,就放在了自己的緩衝區中,如果這個執行緒很忙,那麼當其他的執行緒,改變a的值後,先前的執行緒會忽略a的值,所以就有valatile存在,只保證執行緒的可見性.synchronized既能保證可見性也能保證原子性!!

他與synchronized的區別是什麼??volatile他能保證可見性,也就是當你修改的的時候,他能保證拿到最新的值,但是寫入的不會檢查這個值是否最新的值

join

join()方法的作用是呼叫執行緒等待該執行緒結束後,才能繼續往下進行
atom***類

atom***類本身方法都是原子性的,但不能保證多個方法連續呼叫是原子性的

count++

等價於incrementandget();

寫乙個程式證明atom***()類的多個方法並不構成原子性

atom***()的可以保證可見性麼?請寫乙個程式證明!!

粗粒度的鎖比細粒度的鎖要慢的多

減少了鎖爭搶的可能性
鎖的物件

鎖的物件並不是棧裡面的變數,而是堆記憶體中的位址

public class test2 catch (interruptedexception e)

system.out.println(thread.currentthread().getname());

} }}public static void main(string args) catch (interruptedexception e)

t.o = new object();

new thread(t::m,"t2").start();

}}

程式設計集訓 第一天

一 基本概念 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。陣列 所謂陣列,是有序的元素序列。若將有限個型別相同的變...

併發程式設計學習第一天 執行緒終止

執行緒終止分為兩種 自然終止和強制終止 自然終止即執行緒自然執行完或出現異常終止。強制終止會為暴力終止和通知性終止 暴力終止是通過呼叫stop resume suspend 等,但是在jdk1.8後已不建議使用 已過時 因為stop 會導致執行緒不會正確釋放資源,suspend 執行緒不會釋放資源,...

mysql 第一天 MySQL 系列第一天

mysql 系列第一天這篇文章是黑馬程式設計師 mysql 教程的筆記,好好學習哦。和 mysql 資料庫的互動 客戶端單向連線認證 連線伺服器,認證身份。mysql 資料庫屬於 c s 架構,所以開啟伺服器程式後,需要通過客戶端連線它。mysql 會自帶乙個客戶端程式,可以直接輸入賬號和密碼即可連...