java线程问题小结-----常见面试问题
為什么80%的碼農都做不了架構師?>>> ??
1. ? ? ??線程通信的幾種方法:
?? 共享內存,消息,管道,信號量,socket
2.?????? 什么是線程:
?? 同一個進程不同的執行路徑
3.?????? Java中線程和進程的區別:
??? 一個進程包含很多個線程,線程是進程的子集。
4.?????? 如何在java中實現線程:
在語言層面有兩種方式,第一種是Thread類,第二種是Runnable接口.
5.?????? Thread類中start()方法和run()方法的區別:
start()方法用來創建和啟動線程,內部使用了run()方法。而run()方法本身就是一個方法直接調用不會啟動新的線程。
6.?????? Java中的Runnable和Callable有何不同?
Runnable和Callable都代表了在不同的線程中執行任務,Callable是JDK1.5之后才有的。他們的主要區別是Callable的call方法可以有返回值和拋出異常。而run()方法沒有這些功能。
7.?????? Java中的CyclicBarrier和CountDownLatch有什么區別?
??? 都可以讓一組線程等待其他線程。CountDownLatch不能重新使用,而CyclicBarrier可以重新使用。
8.?????? Java的內存模型是什么?
??? Java內存模型規定和指引java程序在不同的內存架構和CPU,操作系統有確定的行為。它在多線程情況下尤為重要,java內存模型對一個線程所做的所有變動都能夠被其他線程可見提供了保證。他們之間是先行發生關系。
?? 線程內部的代碼能夠按照先后順序執行
?? 對于同一個鎖,一個解鎖操作發生時間一定在一個另一個鎖定操作之前。也叫管程鎖定規則。
前一個volatile的寫操作在后一個volatile的讀操作之前。也叫volatile變量規則。
一個線程內的任何操作必須在線程的start()方法調用之后,也叫做線程啟動規則。
一個線程的所有操作都在線程終止之后,線程終止規則。
一個對象的終結操作必須在這個對象構造完成之后。對象終結規則。
可傳遞性
9.?????? Java中的volatile變量是什么?
?? ?成員變量的特殊修飾符,volatile變量保證讀操作在寫操作之后。
10.?? 什么是線程安全?Vector是一個線程安全類嗎?
??? 每次執行的結果都和單線程執行的一樣就是線程安全。Vector是用同步方法來實現線程安全的。ArrayList是非線程安全的,Vector是線程安全的;HashMap是非線程安全的,HashTable是線程安全的;StringBuilder是非線程安全的,StringBuffer是線程安全的。
11.?? Java中什么是競態條件?
競態條件會導致程序在并發的情況下出現莫名的bugs。多線程對一些資源進行競爭的時候就會出現。
12.?? Java中如何停止一個線程?
使用while()循環
13.?? 一個線程運行時發生異常會怎么樣?
如果異常沒有被捕獲該線程會停止運行,JVM使用Thread.UncaughtExceptionHandler處理未捕獲線程異常中斷
14.?? 兩個線程之間如何實現共享數據?
使用共享對象或者使用阻塞隊列這種數據結構。
15.?? Java中notify和notifyAll有什么區別?
notify()方法不能喚醒某個具體的線程只有一個線程在等待的時候才能使用。notifyAll()喚醒所有的進程并允許他們爭奪鎖確保至少有一個線程能繼續執行。
16.?? 為什么wait, notify和notifyAll不定義在Thread里面?
Java提供的鎖是對象級別的而不是線程級別的,這三個都是對鎖級別的操作,所有定義在Object對象中是因為鎖屬于對象。
17.?? 什么是ThreadLocal變量?
線程自己獨立擁有的局部變量,防止競爭不可占用資源。
18.?? Java中的interrupted和isInterrupted方法的區別?
前者會在中斷狀態下清除后者不會。Java多線程的中斷機制是用內部標識來實現的,調用Thread. Interrupt()方法來中斷一個線程就會設置中斷標識為true。當中斷線程調用靜態方法Thread. Interrupted()來檢查中斷狀態時,中斷狀態會被清0,而非靜態方法isInterrupted()用來查詢線程中斷狀態且不會改變中斷線程標識。一個線程的中斷狀態有可能被其他線程調用中斷來改變。
19.?? 為什么wait和notify方法要在同步塊中調用?
防止wait和notify之間產生競爭
20.?? Java中的同步集合和并發集合的區別?
同步集合和并發集合都為并發和多線程提供了合適的線程安全集合,不過并發集合的可擴展性更高。1.5并發集合更像ConcurrentHashMap,線程安全提供了鎖分離,內部分區,CAS算法等技術。
21.?? 什么是線程池?為什么要用?
創建對象要花費時間,如果任務來時才創建線程那么響應時間會變長。而且一個進程創建的線程數有限。
22.?? 如何用寫代碼解決生產消費問題?
用一個隊列,一段生產一段消費。
23.?? 如何避免死鎖?
死鎖是指兩個或者兩個以上的進程在執行過程中,因爭奪資源而造成的互相等待的現象。死鎖會讓線程掛起。
?? 互斥條件:一個資源每次只能被一個進程使用
?? 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
?? 不剝脫條件:進程已獲得資源,在未使用完之前,不能強行剝奪。
?? 循環等待條件:若干個進程形成首尾相連的資源鏈
24.?? 什么是阻塞式方法?
是指程序一直等待該方法完成期間不做其他的事情,比如socket方法的accept()方法
25.?? Java線程池的submit()和execut()方法的區別?
都是向線程池提交任務,execut()方法返回值void,submit()方法可以返回持有計算結果的future對象。
轉載于:https://my.oschina.net/gaomq/blog/898898
總結
以上是生活随笔為你收集整理的java线程问题小结-----常见面试问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java网页小程序——Java Appl
- 下一篇: vagrant 基本命令讲解