編寫乙個小的搶票程式**如下:
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會引起頻繁...