多執行緒同步

2021-08-11 16:24:45 字數 2709 閱讀 3450

同步:即限制某個資源在同一時間只能被同乙個執行緒訪問。

執行緒安全問題:多個執行緒共同處理共享資源所導致的。

解決:多執行緒處理乙個共享資源時,將處理共享資源的**利用關鍵字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...