多執行緒問題及其處理

2021-06-09 02:47:42 字數 1162 閱讀 4926

編寫乙個小的搶票程式**如下:

package

com.hbsi; //

模擬臨界資源的類

class

tickets

public

void

action(string name) }

//訪問資料的執行緒

class

ticketsthread 

extends

thread

@override

public

void

run()

} catch

(interruptedexception e) }}

//測試多執行緒訪問時的問題

public

class

testmulthread2}

輸出結果如下:

結果出現了重複以及跳躍的票,之所以出現這種情況,是由於執行緒d1和d2的並行結果引起的。當執行緒d1輸出了搶到票的票號以後,還沒來得及改變變數tickets的值,執行緒d2也輸出了搶到票的票號,所以執行緒d1,d2搶到的票號相同;執行緒d1繼續執行改變變數tickets的值,然後睡眠,執行緒d2也改變變數tickets的值,所以在輸出時看到如上情況。

要解決這樣的問題最簡單的方法就是synchronized關鍵字:

作如上修改後輸出結果也就正常了,這就叫做同步**的處理

同步**的作用就是避免多執行緒執行時所出現的安全隱患。

其作用是將列印變數tickets的**和變數tickets變化的**組成乙個專門的方法action,並且使用修飾符synchronized修改該方法,也就是所對於乙個tickets的物件,無論多少個執行緒同時呼叫action方法,只有當乙個執行緒完全執行這個方法以後,其他執行緒才可以執行這個方法。這就相當於乙個執行緒執行到該物件的synchronized方法時,就為這個物件加了一把鎖鎖住了找個物件,其他執行緒在其未執行完的時候無法重複呼叫該方法。

多執行緒處理的問題

執行緒處理的問題 1.非原子操作 原子操作指乙個操作要麼尚未開始,要麼已經完成 而非原子操作則有可能出現中間態,即部分完成的情況。c 語音通常認為所以操作都是非原子性的,在多執行緒環境中,操作的非原子性可能會造成競態條件。2.競態條件 當兩個執行緒同時訪問乙個物件時,無法 哪個執行緒先執行,哪個執行...

多執行緒問題及其解決方法

程序 就是乙個應用程式。執行緒 cup的切換執行線 使用者執行緒,沒有做其它操作,就是直接建立的執行緒。守護執行緒,可以對執行緒new thread setdaemon true 當主線程執行完成後,守護執行緒也立即結束。主線程就是程式在執行的標緻,當主線程結束,就是程式結束,程式結束所有的執行緒都...

C 多執行緒處理求和問題

c 11 的新標準支援了被封裝的多執行緒庫,雖然已經學過了c 的,但是今天想到用多執行緒處理一下求和的問題。ok現在就直接先把 貼出來吧 ps 由於每個人的電腦的cpu核數都不同,我的電腦就是一台很爛的筆記本 雙核,除了打 和掃雷沒什麼其他東西 眾所周知,並行的時候如果執行緒超過cores會引起頻繁...