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