當多個執行緒共享乙份資料,執行相同任務的時候,會發生執行緒安全問題
當四個執行緒執行start()方法以後,這時候,cpu是隨機的,四個執行緒同時搶cpu,如果thread1搶到,當他用完時間片,四個執行緒再一起搶時間片,這時候也不一定誰能搶到,當時間片用完的時候,需要立即釋放,那麼可能會停在執行任務的run方法裡面,假設停在了 ticket.num = ticket.num-1;這,等thread2 ,thread3,thread4也停在這裡,這樣等執行緒再搶到時間片的時候,就會發生資料錯誤的情況,這樣就繁盛了執行緒不安全的情況,這樣就可以用鎖解決
public
class
demo1
}//四個執行緒共享乙份資料
class
ticket
//這個是賣票任務
class
sell
implements
runnable
}}
我們需要給加一把鎖,並且必須他們四個共享的鎖,這時候就能避免當thread1 執行緒用完時間片,但是他還是在鎖裡面,雖然他釋放了時間片,但是必須等他再次搶到cpu的時候,全都執行完這個**,這時候其他三個執行緒才有資格進來,能解決執行緒安全的問題
class
sell
implements
runnable}}
}
上鎖可以上位元組碼檔案物件,兩個共有的,還有this
當我們有乙份資料,兩個執行緒和兩個任務的時候,是列印和輸出任務
這時候我應該列印出來 name:zhangage:19或者 name:liage:20,但是出來的時候有時候年齡和姓名不匹配也是發生了執行緒安全問題,當
thread1 搶到了時間片,可能是卡在了age 和name 那,等到thread2搶到時間片的時候,列印就是錯誤的結果,這時候我們應該給thread1 加鎖,但是列印thread2 也有可能出現執行緒安全問題,所以列印年齡和名字還是 不匹配,這樣的情況我們就應該給syst 和print 同時上一把鎖,這樣person 就是最合適的
public
class
demo2
}class
person
}class
print
implements
runnable
@override
public
void
run(
)else
i = i+1;
}}}}
class
syst
implements
runnable
@override
public
void
run()}
}}
但是對於列印來說,應該是一次輸入一次輸出才對,所以就要寫喚醒等待機制,當thread1 可以搶cpu的時候,thread2等待,暫時 失去搶cpu的能力,當thread1執行完後,他就進入了wait,thread2搶到cpu執行任務,這樣就會交替進行
class
person1
}class
print1
implements
runnable
@override
public
void
run(
)catch
(interruptedexception e)}if
(i%2==0
)else
i = i+1;
person.flag =
!person.flag;
person.
notify()
;}}}
}class
syst1
implements
runnable
@override
public
void
run(
)catch
(interruptedexception e)
} system.out.
println
(thread.
currentthread()
.getname()
+" "
+"name:"
+person.name+
"age:"
+person.age)
; person.flag =
!person.flag;
person.
notify()
;}}}
}
我們除了可以用喚醒等待機制意外,還可以用lock和condition 搭配使用,在單消費者和單生產者中,用哪個都一樣,但是到了多生產者和多消費者的情況下,如果使用synchronized 會用到 notifyall();這樣會把對方全部的執行緒喚醒,
public
class
demo5
}class
person3
public
void
getdata()
catch
(interruptedexception e)
} system.out.
println
(thread.
currentthread()
.getname()
+" "
+"name:"
+name+
"age:"
+age)
; flag =
!flag;
syscon.
signal()
;}finally
}public
void
setdata()
catch
(interruptedexception e)}if
(i%2==0
)else
i = i+1;
flag =
!flag;
precon.
signal()
;}finally}}
class
print3
implements
runnable
@override
public
void
run()}
}class
syst3
implements
runnable
@override
public
void
run()}
}
對執行緒安全的理解
方法中的變數不存在非執行緒安全問題,永遠都是執行緒安全的,這是因為方法內部的變數是私有的特性造成的。synchronized鎖加在方法上,鎖的是物件。效果同synchronized this synchronized加在靜態方法上,鎖的是類。效果同synchronized class.class 多...
對執行緒中斷,join,yield的理解
乙個執行緒在未正常結束之前,被強制終止是很危險的事情.因為它可能帶來完全預料不到的嚴重後果.所以你看到thread.suspend,thread.stop等方法都被deprecated了 那麼不能直接把乙個執行緒搞掛掉,但有時候又有必要讓乙個執行緒死掉,或者讓它結束某種等待的狀態 該怎麼辦呢?優雅的...
關於對執行緒的個人理解
此觀點建議與該部落格上進行編寫 在我們編寫程式的時候,會經常思考執行緒到底是什麼東西,下面請檢視如下的 要點 1 同一物件,啟用2個執行緒 new thread 物件,a new thread 物件,b 2 分別啟用a,b兩個執行緒,兩個物件 new thread a new thread b 觀點...