關於多線程常見問題

1.java中多線程中同步是什麼?

在多線程程序下,同步能控制對共享資源的訪問。如果沒有同步,當一個線程在修改這個變量時,另一個線程在使用或更新同一個變量,這樣容易導致程序出現錯誤結果。

2.實現多線程的幾種方法?

Java線程可以通過實現Runnable接口或是繼承Thread類來實現,若是打算多繼承,則提前使用繼承Runnable接口。

3.Thread.start()與Thread.run()有何區別?

使用Thread.start()啓動線程,是線程處於就緒狀態,當cpu分配時間給該線程時,由JVM調度run()方法執行。

4.爲什麼需要start()方法和run()方法?可以直接用run()方法來完成任務嗎?

我們需要start()&run()方法是因爲JVM創建一個單獨的線程不同於普通的方法的調用,所以這項工作由線程的start方法來完成,start方法由本地方法實現,需要顯式地調用,使用這兩個方法的另一個好處就是任何一個對象都能作爲線程運行,只要它實現了Runnable接口,這就避免了因繼承了Thread類而造成的java多繼承的問題。

5.什麼是ThreadLocal類?怎麼使用它?

ThreadLocal是一個線程級別的局部變量,並非“本地線程”。ThreadLocal爲每個使用該變量的線程提供了一個獨立的變量副本,每個線程修改副本時不影響其它線程對象的副本(譯者注)。
下面是線程局部變量(ThreadLocal variables)的關鍵點:
一個線程局部變量(ThreadLocal variables)爲每個線程方便地提供了一個單獨的變量。
ThreadLocal實例通常作爲靜態的私有的(private static)字段出現在一個類中,這個類用來關聯一個線程。
當多個線程訪問ThreadLocal實例時,每個線程維護ThreadLocal提供的獨立的變量副本。

6.什麼時候拋出InvalidMonitorException異常,爲什麼?

調用wait()/notify()/notifyAll()中的任何一個方法時,如果當前線程沒有獲得該對象的鎖,那麼就會拋出IllegalMonitorStateException的異常(也就是說程序在沒有執行對象的任何同步塊或者同步方法時,仍然嘗試調用wait()/notify()/notifyAll()時)。

7.Sleep()、suspend()和wait()之間有什麼區別?

Thread.sleep()使當前線程在指定的時間處於“非運行”狀態。線程一直持有對象的監視器。比如一個線程當前在一個同步塊或同步方法中,其它線程不能進入該塊或方法中。如果另一線程調用了interrupt()方法,它將喚醒那個“睡眠的”線程。
注意:sleep()是一個靜態方法。這意味着只對當前線程有效,一個常見的錯誤就是調用t.sleep(),(這裏的t是一個不同於當前線程的線程)。即便是執行t.sleep(),也是當前線程進入睡眠,而不是t線程。t.suspend()是過時的方法,使用suspend()導致線程進入停滯狀態,該線程會一直持有對象的監視器,suspend()容易引起死鎖的問題。
Object.wait()使當前線程處於“不可運行”狀態,和sleep()不同的是wait是Object的方法而不是thread。調用object.wait()時,線程先要獲得這個對象的對象鎖,當前線程必須在鎖對象保持同步,把當前線程添加到等待隊列中,隨後另一線程可以同步同一個對象鎖來調用Object.notify(),這樣將喚醒原來等待中的線程,然後釋放該鎖。基本上wait()/notify()與sleep()/interrupt()類似,只是前者需要回去對象鎖。

8.在靜態方法上使用同步時會發生什麼事?

同步靜態方法時會獲取該類的“Class”對象,所以當一個線程進入同步的靜態方法中時,線程監視器獲取類本身的對象鎖,其它線程不能進入這個類的任何靜態同步方法。它不像實例方法,因爲多個線程可以同時訪問不同實例同步實例方法。

9.當一個同步方法已經執行,線程能夠調用對象上的非同步實例方法嗎?

可以,一個非同步方法總是可以被調用而不會有任何問題。

10.在一個對象上兩個線程可以調用兩個不同的同步實例方法嗎?

不能,因爲一個對象已經同步了實例方法,線程獲取了對象的對象鎖。所以只有執行完該方法釋放對象鎖後才能執行其它同步方法。

11.什麼是死鎖?

死鎖就是兩個或兩個以上的線程被無限制地阻塞,線程之間相互等待所需的資源。這種情況可能發生在彼此都需要得到對方佔有的鎖,但彼此都不釋放這個鎖。

轉載出處:
http://blog.jobbole.com/18571/

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