多執行緒靜態同步函式

2021-10-01 13:04:09 字數 1763 閱讀 4606

多執行緒靜態同步函式和非靜態同步函式的區別是啥?

靜態同步函式:就是方法使用了static關鍵字修飾

非靜態同步函式:沒有用static關鍵字修飾的方法,也就是使用this鎖的同步函式

那麼靜態同步函式使用的啥鎖呢?

分析:兩個執行緒,乙個執行緒使用靜態同步函式,乙個使用同步**塊this鎖,如果執行緒不同步(執行緒不安全),就說明靜態同步函式使用的不是this鎖,如果執行緒同步,就說明使用的是this鎖。

好了,我們用**來進行驗證吧:

package com.newdemo.controller.test;

class

traindemo12

implements

runnable

catch

(interruptedexception e)

synchronized

(this)}

}}else

catch

(interruptedexception e)

sale()

;//**火車票}}

}//給方法加 static synchronized ,就是靜態同步函式,也可以解決執行緒同步(執行緒安全問題)

public

static synchronized void

sale()

}}public

class

threaddemo11

}

結果如下:

結果是執行緒不安全,就是不同步,所以說明了靜態同步函式使用的不是this鎖。

那麼到底是啥鎖呢,其實就是當前位元組碼檔案。物件.class鎖

我們可以做個驗證,把乙個執行緒使用靜態同步函式,乙個使用同步**塊位元組碼檔案鎖,如果執行緒不同步(執行緒不安全),就說明靜態同步函式使用的不是this鎖,如果執行緒同步,就說明使用的是位元組碼檔案鎖。

**如下:

package com.newdemo.controller.test;

class

traindemo13

implements

runnable

catch

(interruptedexception e)

synchronized

(traindemo13.

class)}

}}else

catch

(interruptedexception e)

sale()

;//**火車票}}

}//給方法加 static synchronized ,就是靜態同步函式,也可以解決執行緒同步(執行緒安全問題)

public

static synchronized void

sale()

}}public

class

threaddemo12

}

使用了traindemo13.class這個鎖之後,效果如下:

說明是執行緒同步的,那就是靜態同步函式使用的就是位元組碼檔案。

共享全域性變數是靜態或者非靜態和(同步函式,靜態同步函式)麼有任何關係。記住了

多執行緒之靜態同步函式 方法

如果同步函式被靜態修飾後,使用的鎖是什麼呢?通過驗證,發現不在是this。因為靜態方法中也不可以定義this。靜態進記憶體是,記憶體中沒有本類物件,但是一定有該類對應的位元組碼檔案物件。類名.class 該物件的型別是class 靜態的同步方法,使用的鎖是該方法所在類的位元組碼檔案物件。類名.cla...

多執行緒 同步函式

來看下面這個程式 需求 銀行有一金庫。有兩個儲戶分別存300元,每次存100,存3次。目的 該程式是否有安全問題。如果有,如何解決?class bank class cus implements runnable class bankdemo 執行結果可能為 如何找問題 1.明確哪些 是多執行緒執行...

多執行緒靜態同步函式的鎖是class 物件

通過驗證發現 同步函式如果被靜態修飾後,不再以this 為鎖 靜態進記憶體時,記憶體中沒有本類物件,但是一定有該類的位元組碼檔案物件 類名.class 該物件的型別是class 靜態的同步方法,使用的鎖是該方法所在類的位元組碼檔案物件。類名.class class ticket implements...