1.**執行的前提:執行緒必須占有cpu
2.執行緒有資格競爭cpu的前提:執行緒是runnable狀態
0.搶鎖的前提是先搶cpu
1.搶鎖失敗
狀態從runnable 修改為 blocked
執行緒從就緒佇列移動到該鎖的阻塞佇列上
從開始請求鎖到最終搶到鎖,經歷了滄海桑田
放乙個陣列,長度為100000,建立三個執行緒,完成這麼乙個任務:陣列裡的每個值都乘以3
class
pritice2
@override
public
void
run()}
}}}public
static
void
main
(string[
] args)
throws interruptedexception
system.out.
println
(arrays.
tostring
(array));
monk m1 =
newmonk
(array)
; monk m2 =
newmonk
(array)
; monk m3 =
newmonk
(array)
; m1.
start()
; m2.
start()
; m3.
start()
; m1.
join()
; m2.
join()
; m3.
join()
; system.out.
println
(arrays.
tostring
(array));
}}
[2, 4, 0, 0, 4, 0, 8, 1, 6, 5, …這裡我講三個點[6, 12, 0, 0, 12, 0, 24, 3, 18, 15…
是符合的
我一開始加鎖的時候,是這麼寫的
public
void
run()}
}/*我第一次寫加鎖的步驟,出現了陣列下標越界
怎麼理解:獲得鎖的過程是滄海桑田
index < 長度 進入迴圈
比如到了下標為99999的時候,他進入迴圈,但是此時他不一定搶到鎖了,
有可能鎖被別人拿去用了
這個時候輪到他的時候,下標就越界了!!!!
*/
我第二次寫了個加鎖
synchronized
(pritice.
class)}
/* 這個貌似是沒問題的,但其實也挺嚴重的
獲得鎖之後,這個人就直接全鎖住,吃獨食,自己給加到了100000,
別人獲得鎖的時候就不起作用
*/
正確寫法(不忘初心,裡外判斷)
public
void
run()}
}}
synchronized
優點:基本有了它,執行緒能保證安全
缺點:效率低/不夠靈活
class
deadlock
catch
(interruptedexception e)
synchronized
(block)}}
}private
static
class
bthread
extends
thread}}
}public
static
void
main
(string[
] args)
throws interruptedexception
}
jconsole檢視 執行緒sychronized的坑
執行緒的理解定義 sychronized對方法鎖呼叫時候是對物件加鎖,這樣當執行緒再次使用物件的加鎖資源就不需要重新獲取鎖 1.sychronized對物件方法使用同步時,鎖定的是整個物件,但如果有其他執行緒在加鎖過程中執行了該物件的非同步方法或屬性,卻可以被其他執行緒同時執行。這點很奇怪.鎖定物件...
關於PagedDataSourced的使用
asp.net提供了三個功能強大的列表控制項 datagrid datalist和repeater控制項,但其中只有datagrid控制項提供分頁功能。相對datagrid,datalist和repeater控制項具有更高的樣式自定義性,所以很多時候我們喜歡使用datalist或repeater控制...
關於selenium base page的使用
在使用unittest框架的過程中,我們經常需要重複地寫setup和teardown函式,為了減少重複性的工作,可以將這部分 封裝起來。如下 import unittest from common.base page import basepage from common.browser impor...