多執行緒鎖 詳解

2022-05-05 04:39:13 字數 2332 閱讀 9146

先來講什麼是執行緒:

即:thread和runnable兩個類,可以實現執行緒

class card extends thread

於是,,我們在執行一下看下我們的日誌輸出是什麼樣的情況:

ii:1currentthreadno:thread-0

ii:2currentthreadno:thread-0

ii:3currentthreadno:thread-2

ii:4currentthreadno:thread-2

ii:5currentthreadno:thread-2

ii:6currentthreadno:thread-2

ii:7currentthreadno:thread-2

ii:8currentthreadno:thread-2

ii:531currentthreadno:thread-3

ii:532currentthreadno:thread-30

ii:533currentthreadno:thread-17

ii:534currentthreadno:thread-28

ii:535currentthreadno:thread-24

ii:536currentthreadno:thread-13

ii:537currentthreadno:thread-26

ii:538currentthreadno:thread-9

ii:539currentthreadno:thread-22

ii:540currentthreadno:thread-18

ii:541currentthreadno:thread-14

ii:542currentthreadno:thread-10

ii:543currentthreadno:thread-5

ii:544currentthreadno:thread-6

大吃一驚,我們最終輸出的結果居然到了544,而我們同時參與併發的執行緒任務才只有500個,這又是為啥呢?

原來,我們沒有對run內部呼叫的所有**(我們把所有這些**看成乙個方法,)進行加鎖操作,所以,我們需要對方法進行如下改進:

@override

public void run(){

synchronized(this){

while(ii<500){ 

ii++;

queue.add(ii);

system.out.println("ii:" + ii + "currentthreadno:" + thread.currentthread().getname());

但是,當我們執行多個任務排程的時候,發現,在乙個執行緒參與一次迭代的時候,接下去還是會有其他執行緒參與競爭,這樣的話,問題就來了

為什麼我們加了鎖以後,我們的執行緒還是不安全,還是會有其他執行緒參與競爭,,,,這個問題很嚴重啊

於是我們將方法修改如下 :

@override

public void run(){

synchronized(threadsample.class){

while(ii<500){ 

ii++;

queue.add(ii);

system.out.println("ii:" + ii + "currentthreadno:" + thread.currentthread().getname());

這個時候,我們高興的發現,我們的輸出,終於是執行緒安全的了,就是當我們乙個執行緒執行這個執行緒體的過程中,其他執行緒是無法參與進來的,輸出如下:

ii:1currentthreadno:thread-0 tue apr 30 15:18:50 cst 2019

ii:2currentthreadno:thread-0 tue apr 30 15:18:50 cst 2019

ii:3currentthreadno:thread-0 tue apr 30 15:18:50 cst 2019

ii:4currentthreadno:thread-0 tue apr 30 15:18:50 cst 2019

ii:497currentthreadno:thread-0 tue apr 30 15:18:50 cst 2019

ii:498currentthreadno:thread-0 tue apr 30 15:18:50 cst 2019

ii:499currentthreadno:thread-0 tue apr 30 15:18:50 cst 2019

ii:500currentthreadno:thread-0 tue apr 30 15:18:50 cst 2019

這樣,我們的執行緒終於安全了。

鎖:synchronized

詳解iOS 多執行緒 鎖 互斥 同步

方法程式設計客棧一,synchronized id anobject 最簡單的方法 會自動對引數物件加鎖,保證臨界區內的 執行緒安全 synchronized self 方法二,nslock nslock物件實現了nslocking protocol,包含幾個方法 比如 nslock thelock...

多執行緒,執行緒鎖,例項

多執行緒可以分多條執行緒,同時執行程式,但也因此出現一些問題,通過執行緒鎖可以解決 包子例項 廚師做包子,顧客吃包子,多餘50個包子廚師停止做包子,包子為零顧客停止吃包子,當廚師做到10個後顧客可以吃包子 顧客類 customer.class public class customer implem...

多執行緒 互斥鎖

include include include handle mutex null srwlock g lock 改變乙個變數的時候需要鎖定 int num 6400000 在讀期間,值一直在變化,沒有鎖定。dword winapi reada void p i 使用acquiresrwlocksh...