線程簡單問題

 

1.線程安全如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。

2. Javanotify notifyAll有什麼區別?

因爲多線程可以等待單監控鎖,Java API 的設計人員提供了一些方法當等待條件改變的時候通知它們,但是這些方法沒有完全實現。notify()方法不能喚醒某個具體的線程,所以只有一個線程在等待的時候它纔有用武之地。而notifyAll()喚醒所有線程並允許他們爭奪鎖確保了至少有一個線程能繼續運行。

 

3.爲什麼wait, notify 和 notifyAll這些方法不在thread類裏面?

一個很明顯的原因是JAVA提供的鎖是對象級的而不是線程級的,每個對象都有鎖,通過線程獲得。如果線程需要等待某些鎖那麼調用對象中的wait()方法就有意義了。如果wait()方法定義在Thread類中,線程正在等待的是哪個鎖就不明顯了。簡單的說,由於waitnotifynotifyAll都是鎖級別的操作,所以把他們定義在Object類中因爲鎖屬於對象。

4. 如何避免死鎖?

Java多線程中的死鎖死鎖是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。這是一個嚴重的問題,因爲死鎖會讓你的程序掛起無法完成任務,死鎖的發生必須滿足以下四個條件:

       互斥條件:一個資源每次只能被一個進程使用。

       請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。

       不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。

       循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。

避免死鎖最簡單的方法就是阻止循環等待條件,將系統中所有的資源設置標誌位、排序,規定所有的進程申請資源必須以一定的順序(升序或降序)做操作來避免死鎖。這篇教程有代碼示例和避免死鎖的討論細節。

5.Java多線程中調用wait() 和 sleep()方法有什麼不同?

Java程序中wait sleep都會造成某種形式的暫停,它們可以滿足不同的需要。wait()方法用於線程間通信,如果等待條件爲真且其它線程被喚醒時它會釋放鎖,而sleep()方法僅僅釋放CPU資源或者讓當前線程停止執行一段時間,但不會釋放鎖。

 

 

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章