線程中wait和sleep的區別
wait():wait()方法是Object類裏的方法,用於線程通訊,掛起,放cpu,放鎖
1進入等待池
2釋放對象鎖,超時後返回
3其它線程能夠訪問
wait至關於多車道中靠邊停車,釋放鎖和cpu
sleep():是Thread類的方法,用於線程的運行狀態控制,睡眠,必須捕獲異常,放cpu,不放鎖
1阻塞當前線程,出讓cpu
2鎖沒有釋放,其它線程沒法訪問這個對象
3休眠時間滿了之後不必定執行,由於其它線程可能正在運行,出發sleep的線程有更高優先級
sleep至關於多車道中,車停在車道上(睡着了),該車道沒法使用,而後多出一條車道能夠給別的車使用
【注意】notify並不釋放鎖,只是告訴調用過wait方法的線程能夠去參與得到鎖的競爭了,但不是立刻獲得鎖,由於鎖還在別人手裏,別人還沒釋放。若是notify方法後面的代碼還有不少,須要這些代碼執行完後纔會釋放鎖
【總結】notify是告訴wait()的線程何時能夠去繼續去申請鎖了
sleep(100L)是佔用cpu,線程休眠100毫秒,其餘進程不能再佔用cpu資源,wait(100L)是進入等待池中等待,交出cpu 等系統資源供其餘進程使用,在這100毫秒中,該線程能夠被其餘線程notify,但不一樣的是其餘在等待池中的線程不被notify不會出來,但這個線程 在等待100毫秒後會自動進入就緒隊列等待系統分配資源,換句話說,sleep(100)在100毫秒後確定會運行,但wait在100毫秒後還有等待 os調用分配資源,因此wait100的中止運行時間是不肯定的,但至少是100毫秒。面試
多線程:
1同步包括互斥,互斥實際上是一種特殊的同步
2ThreadLocal 線程局部變量的做用和目的:用於實現線程內的數據共享,即對於相同的程序代碼,多個模塊在同一個線程中運行時要共享一份數據,而在另外線程中運行時又共享另一份數
3多線程共享數據
多個線程行爲一致,共同操做一個數據源。也就是每一個線程執行的代碼相同,可使用同一個 Runnable 對
象,這個 Runnable 對象中有那個共享數據
多個線程行爲不一致,共同操做一個數據源。也就是每一個線程執行的代碼不一樣,這時候須要用不一樣的
Runnable 對象。
4線程併發庫 太多了緩存
實現線程安全的兩種方式?
synchronized與Lock。
兩者的區別是什麼?
synchronized不能中斷等待;
Lock能夠中斷等待。
synchronized在JVM層面實現,出現異常時能夠自動釋放鎖定;
Lock在代碼層面實現,必須在finally{}中unLock。
資源競爭不激烈時,synchronized性能優;
資源競爭激烈時,Lock性能優。安全
Thread 類中的start() 和 run() 方法有什麼區別?
當你調用run()方法的時候,只會是在原來的線程中調用,沒有新的線程啓動,start()方法纔會啓動新線程
run()是start()的回調函數多線程
Java中Runnable和Callable有什麼不一樣?
主要區別是Callable的 call() 方法能夠返回值和拋出異常,而Runnable的run()方法沒有這些功能。Callable能夠返回裝載有計算結果的Future對象
用Runnable仍是Thread?
Java不支持類的多重繼承,但容許你調用多個接口。因此若是你要繼承其餘類,固然是調用Runnable接口好了併發
Java中的volatile 變量是什麼?
volatile是一個特殊的修飾符,只有成員變量才能使用它。在Java併發程序缺乏同步類的狀況下,多線程對成員變量的操做對其它線程是透明的。volatile變量能夠保證下一個讀取操做會在前一個寫操做以後發生,就是上一題的volatile變量規則函數
爲何wait, notify 和 notifyAll這些方法不在thread類裏面?
因爲wait,notify和notifyAll都是鎖級別的操做,因此把他們定義在Object類中由於鎖屬於對象
Java中堆和棧有什麼不一樣?
爲何把這個問題歸類在多線程和併發面試題裏?由於棧是一塊和線程緊密相關的內存區域。每一個線程都有本身的棧內存,用於存儲本地變量,方法參數和棧調用,一個線程中存儲的變量對其它線程是不可見的。而堆是全部線程共享的一片公用內存區域。對象都在堆裏建立,爲了提高效率線程會從堆中弄一個緩存到本身的棧,若是多個線程使用該變量就可能引起問題,這時volatile 變量就能夠發揮做用了,它要求線程從主存中讀取變量的值。
如何避免死鎖?
死鎖是指兩個或兩個以上的進程在執行過程當中,因爭奪資源而形成的一種互相等待的現象,若無外力做用,它們都將沒法推動下去。這是一個嚴重的問題,由於死鎖會讓你的程序掛起沒法完成任務,死鎖的發生必須知足如下四個條件:
互斥條件:一個資源每次只能被一個進程使用。
請求與保持條件:一個進程因請求資源而阻塞時,對已得到的資源保持不放。
不剝奪條件:進程已得到的資源,在末使用完以前,不能強行剝奪。
循環等待條件:若干進程之間造成一種頭尾相接的循環等待資源關係。
避免死鎖最簡單的方法就是阻止循環等待條件,將系統中全部的資源設置標誌位、排序,規定全部的進程申請資源必須以必定的順序(升序或降序)作操做來避免死鎖。
Java線程池中submit() 和 execute()方法有什麼區別?
兩個方法均可以向線程池提交任務,execute()方法的返回類型是void,它定義在Executor接口中, 而submit()方法能夠返回持有計算結果的Future對象,它定義在ExecutorService接口中,它擴展了Executor接口
Java多線程中調用wait() 和 sleep()方法有什麼不一樣?
Java程序中wait 和 sleep都會形成某種形式的暫停,它們能夠知足不一樣的須要。wait()方法用於線程間通訊,若是等待條件爲真且其它線程被喚醒時它會釋放鎖,而sleep()方法僅僅釋放CPU資源或者讓當前線程中止執行一段時間,但不會釋放鎖。性能