同步:即限制某個資源在同一時間只能被同乙個執行緒訪問。
執行緒安全問題:多個執行緒共同處理共享資源所導致的。
解決:多執行緒處理乙個共享資源時,將處理共享資源的**利用關鍵字synchronized修飾。
同步**塊:synchronized修飾**塊,
synchronized(lock){}
同步方法:synchronized修飾方法,
synchronized 返回值型別 方法名(引數){}
同步出現的問題:
執行緒在執行同乙個**時每次都會判斷鎖的狀態,非常消耗的狀態 ,效率較低。
還有可能出現死鎖問題。
同步**塊的例子:
package study;
public class example07
}class salethread implements runnable catch (interruptedexception e)
system.out.println(thread.currentthread().getname()+"-----賣出的票"+ticket--);}}
} 結果:
某幾個執行緒出現了相同的票數(有時候還會出現負數的票),是因為在多個執行緒在處理共享資源時所導致的,當使用下面的**時卻沒有重複的票數:
package study;
public class example05
}class ticketwindow implements runnable}}
} 結果:
這是因為在程式中新增sleep()方法使執行緒進行等待引起的。
try catch (interruptedexception e)
在編寫**中出現的問題:
在while迴圈外習慣性的新增了for(int i=0;i<10;i++)迴圈,如下:
for(int i=0;i<10;i++) catch (interruptedexception e)
system.out.println(thread.currentthread().getname()+"-----賣出的票"+i);
ticket--;}}
結果:輸出都是0
原因:不了解迴圈語句,在句中實際上有了兩個迴圈,在i=0的迴圈中,while迴圈就已經使得ticket為0,結束迴圈了。根本沒有了解透什麼樣的迴圈應該在什麼樣的況下使用、怎麼樣使用。
同步**塊:
package study;
public class example07
}class salethread implements runnable catch (interruptedexception e)
if(ticket>0)else}}
}}結果:
輸出的結果不僅沒有出現0和負數,而且輸出的票數還是按順序排的,因為某個執行緒在釋放資源之前其他執行緒都不可以使用。
注意:lock所鎖物件可以是任意型別的物件,但是必須是唯一的,以便多個執行緒使用的是同乙個所物件,所以不能放在run()中。
使用另一種方式的**塊也同樣可以實現:
package study;
public class example07
}class salethread implements runnable catch (interruptedexception e)
if(ticket>0)else
}}*/
synchronized (lock) catch (interruptedexception e)
system.out.println(thread.currentthread().getname()+"-----賣出的票"+ticket--);}}
}}結果:
只是沒有想到為什麼課本會使用上乙個同步**塊。
同步方法:
package study;
public class example06
}class ticket1 implements runnable}}
public synchronized void saleticket() catch (interruptedexception e)
system.out.println(thread.currentthread().getname()+"---賣出的票"+ticket--);}}
} 結果:
注意:同步**塊有鎖,同步方法也有,同步方法的所就是當前呼叫該方法的鎖,也就是this指向的物件。當同步的方法是靜態方法時,該方法的鎖是該方法所在類的class物件,該物件可以用「類名.class」的方法獲取。
多執行緒同步
synchronized 物件 其中物件相當於乙個標誌 鎖 用於判斷 同步 塊 同步的前提必須是兩個或兩個以上的執行緒,且共用同乙個鎖 同步解決了多執行緒的安全問題 弊端 多執行緒需要判斷鎖,消耗了資源 同步函式 將synchronized放在函式名前面即可 即具有同步性質 使用的鎖是this 靜態...
多執行緒同步
子執行緒迴圈10次,接著主線程迴圈100,接著又回到子執行緒迴圈10次,接著再回到主線程又迴圈100,如此迴圈50次,請寫出程式 package com.itcast public class traditionthreadcommuncation start 子執行緒 for int j 1 j ...
多執行緒同步
關於gil的示例問題,為什麼使用多執行緒之後,加了100w次和減了100w次之後,數值不是為0的 使用dis庫來檢視位元組碼 from dis import dis def add1 global a a 1 dis add1 輸出 19 0 load global 0 a 2 load const...