Java并發(fā)編程面試題 75題_第1頁
Java并發(fā)編程面試題 75題_第2頁
Java并發(fā)編程面試題 75題_第3頁
Java并發(fā)編程面試題 75題_第4頁
Java并發(fā)編程面試題 75題_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、在java中守護(hù)線程和本地線程區(qū)別?java(Daemon)和用戶線程(User)。Thread.setDaemon(boolon);true線程。Thread.setDaemon()Thread.start()之前調(diào)用,否則運(yùn)行時(shí)會(huì)拋唯一的區(qū)別是判斷虛擬機(jī)(JVM)何時(shí)離開,Daemon是為其他線程提供服務(wù),如果全部的UserThread已經(jīng)撤離,Daemon沒有可服務(wù)的線程,JVM撤離。也JVM(但不一定),用戶線程是程序創(chuàng)JVM不再產(chǎn)生垃圾,守護(hù)線程自然就沒事可干了,當(dāng)垃圾回收線程是Java虛擬機(jī)上僅剩的線程時(shí),Java虛擬機(jī)會(huì)自動(dòng)離開。擴(kuò)展:ThreadDumpdaemon進(jìn)程,可能會(huì)有:服務(wù)守護(hù)進(jìn)程、編譯守護(hù)進(jìn)程、windows下的監(jiān)聽Ctrl+breakFinalizer守護(hù)進(jìn)程、引用處理守護(hù)進(jìn)程、GC守護(hù)23CPU,CPU時(shí),為了讓各個(gè)線程都有執(zhí)行的機(jī)會(huì),就需要輪轉(zhuǎn)使用CPU。不同的線程切換使用CPU4134Java1、高優(yōu)先級(jí)線程吞噬所有的低優(yōu)先級(jí)線程的CPU3wait5、Java6、什么是線程組,為什么在JavaThreadGroup7、為什么使用Executor框架?newThread()比較消耗性能,創(chuàng)建一個(gè)線程是比較耗newThread()創(chuàng)建的線程缺乏管理,被稱為野線程,而且可以無限制的創(chuàng)newThread()8、在Java中Executor和Executors的區(qū)別?ExecutorsExecutorExecutorServiceExecutor使用ThreadPoolExecutorFuture的完成,并可以使用get()方法獲取計(jì)算的結(jié)果。9、如何在Windows和Linux上查找哪個(gè)線程使用的CPU時(shí)間最長(zhǎng)?10、什么是原子操作?在JavaConcurrencyAPI中有哪些原子類(atomicclasses)?原子操作(atomicoperation)意為”不可被中斷的一個(gè)或一系列操作”。JavaCASCAS—Compare&Set,Compare&Swap,CPUCASint++1為了解決這個(gè)問題,必須保證增加操作是原子的,在JDK1.5之前我們可以使JDK1.5,java.util.concurrent.atomic了intlong類型的原子包裝類,它們可以自動(dòng)的保證對(duì)于他們的操作是原java.util.concurrentJVM解決ABA問題的原子類:AtomicMarkableReference(通過引入一個(gè)boolean來反映中間有沒有變過),AtomicStampedReference(int11、JavaConcurrencyAPI中的Lock接口(LockLockLocksynchronized,Lock的(tryLock方法)、定時(shí)的(tryLock帶參方法)、可中斷的(lockInterruptibly)、可多條件隊(duì)列的(newCondition方法)鎖操作。另外Lock的實(shí)現(xiàn)類基本都支持非公平鎖(默認(rèn))和公平鎖,synchronized只支持非12、什么是Executors框架?ExecutorExecutors框架可以非常方便的創(chuàng)建一個(gè)線程池。13阻塞隊(duì)列(BlockingQueue)JDK7提供了7ArrayBlockingQueue:一個(gè)由數(shù)組結(jié)構(gòu)組成的有界阻塞隊(duì)列。LinkedBlockingQueue:一個(gè)由鏈表結(jié)構(gòu)組成的有界阻塞隊(duì)列。PriorityBlockingQueueJava5wait,notify,notifyAll,sychronized這些關(guān)鍵字。而在java5BlockingQueueQueueBlockingQueue放入元素時(shí),如果隊(duì)列已滿,則線程被阻塞,當(dāng)消費(fèi)者線程試BlockingQueuesocket14、什么是Callable和CallableRunnable,RunnableCallable被線程執(zhí)行后,可以返回值,這個(gè)返回值可以被Future拿到,也就是說,F(xiàn)uture可以拿到異步執(zhí)行任務(wù)的返回值。可以認(rèn)為是帶有回調(diào)的RunnableFutureCallable,F(xiàn)uture15、什么是FutureTask?使用ExecutorService啟在Java并發(fā)程序中FutureTask表示一個(gè)可以取消的異步運(yùn)算。它有啟動(dòng)和getFutureTask可以對(duì)調(diào)用了Callable和Runnable的對(duì)象進(jìn)行包裝,由于FutureTask也是調(diào)用了RunnableExecutor來執(zhí)行。16何為同步容器:可以簡(jiǎn)單地理解為通過synchronized來實(shí)現(xiàn)同步的容器,如果有多個(gè)線程調(diào)用同步容器的方法,它們將會(huì)串行執(zhí)行。比如Vector,Hashtable,以及Collections.synchronizedSet,synchronizedList等方法Vector,Hashtable同步的方法上加上關(guān)鍵字synchronized。ConcurrentHashMap分段鎖,在這種鎖機(jī)制下,允許任意數(shù)量的讀線程并發(fā)地訪問map,并且執(zhí)行map,同時(shí)允許一定數(shù)量的寫操作線程并發(fā)地修改map,所以它可以在并發(fā)環(huán)境下實(shí)現(xiàn)更高的吞吐量。18的順序時(shí),則我們認(rèn)為這發(fā)生了競(jìng)爭(zhēng)條件(racecondition)。19、你將如何使用threaddump?你將如何分析Threaddump?新建狀態(tài)用new語句創(chuàng)建的線程處于新建狀態(tài),此時(shí)它和其他Java就緒狀態(tài)當(dāng)一個(gè)線程對(duì)象創(chuàng)建后,其他線程調(diào)用它的start()方法,該線程就進(jìn)入就緒狀態(tài),Java位于可運(yùn)行池中,等待獲得CPU的使用權(quán)。運(yùn)行狀態(tài)CPU,執(zhí)行程序代碼。只有處于就緒狀態(tài)的線程才有阻塞狀態(tài)阻塞狀態(tài)是指線程因?yàn)槟承┰蚍艞塁PU,暫時(shí)停止運(yùn)行。當(dāng)線程處于阻塞狀態(tài)時(shí),JavaCPU。直到線程重新進(jìn)入就緒狀態(tài),它才有阻塞狀態(tài)可分為以下3位于對(duì)象等待池中的阻塞狀態(tài)(Blockedinobject’swaitwait()方法,Java位于對(duì)象鎖池中的阻塞狀態(tài)(Blockedinobject’slock已經(jīng)被其他線程占用,Java其他阻塞狀態(tài)(Otherwisesleep()join()方法,或者發(fā)出了I/O死亡狀態(tài)當(dāng)線程退出run()20、為什么我們調(diào)用start()方法時(shí)會(huì)執(zhí)行run()方法,為什么我們不能直接調(diào)用run()方法?start()run()方法里的代但是如果你直接調(diào)用run()代碼,只會(huì)把run21、JavaJavasuspend()、resume()方法對(duì)于線程進(jìn)行阻塞喚Objectwait()和,wait、notifywait()方法都將鎖,直到獲取成功才能往下執(zhí)行;其次,wait、notify方法必須在synchronized塊或方法中被調(diào)用,并且要保證同步塊或方法的鎖對(duì)象與調(diào)用wait、notifywait經(jīng)成功獲取某對(duì)象的鎖,執(zhí)行wait阻塞后當(dāng)前線程就將之前獲取的對(duì)象鎖釋22、在Java中CycliBarriar和CountdownLatchCyclicBarrier可以重復(fù)使用,而CountdownLatchJava的concurrent包里面的CountDownLatch其實(shí)可以把它看作一個(gè)計(jì)數(shù)CountDownLatchawait()方法都會(huì)阻塞,直到這個(gè)計(jì)數(shù)器的計(jì)數(shù)值被其他的線程減為0為止。所以在當(dāng)前計(jì)數(shù)到達(dá)零之前,await方法會(huì)一直受阻塞。之后,會(huì)釋放所有等待的線程,await的所有后續(xù)調(diào)用都將立即返回。這種現(xiàn)象只出現(xiàn)一次——計(jì)數(shù)無法被重置。如果需要重置計(jì)數(shù),請(qǐng)考慮使用CyclicBarrier。CountDownLatch續(xù)往下執(zhí)行的任務(wù)調(diào)用一個(gè)CountDownLatch對(duì)象的await()方法,其他的任務(wù)執(zhí)行完自己的任務(wù)后調(diào)用同一個(gè)CountDownLatch對(duì)象上的countDown()方await()CountDownLatch對(duì)象的計(jì)數(shù)值減到0為止。CyclicBarrier一個(gè)同步輔助類,它允許一組線程互相等待,直到到達(dá)某個(gè)公(commonbarrierpoint)。在涉及一組固定大小的線程的程序中,這些線程必須不時(shí)地互相等待,此時(shí)CyclicBarrier很有用。因?yàn)樵揵arrier在釋放等待線程后可以重用,所以稱它為循環(huán)的barrier。不可變對(duì)象(ImmutableObjects)即對(duì)象一旦被創(chuàng)建它的狀態(tài)(對(duì)象的數(shù)據(jù),也即對(duì)象屬性值)就不能改變,反之即為可變對(duì)象(MutableObjects)。不可變對(duì)象的類即為不可變類(ImmutableClass)。JavaString、基本類型的包裝類、BigIntegerBigDecimalfinal(this24在上下文切換過程中,CPU會(huì)停止處理當(dāng)前運(yùn)行的程序,并保存當(dāng)前程序運(yùn)行程序中,上下文切換過程中的“頁碼”信息是保存在進(jìn)程控制塊(PCB)PCB還經(jīng)常被稱作“切換楨”(switchframe)CPU上下文切換是存儲(chǔ)和恢復(fù)CPU25、Java計(jì)算機(jī)通常只有一個(gè)CPU,在任意時(shí)刻只能執(zhí)行一條機(jī)器指令,每個(gè)線程只有獲CPU的使用權(quán)才能執(zhí)行指令.所謂多線程的并發(fā)運(yùn)行,其實(shí)是指從宏觀上看,各個(gè)線程輪流獲得CPU的使用權(quán),分別執(zhí)行各自的任務(wù).在運(yùn)行池中,會(huì)有多個(gè)CPU,JAVA線程調(diào)度是指按照特定機(jī)制為多個(gè)線程分配CPU的使用權(quán).cpu程占用的CPU的時(shí)間片這個(gè)也比較好理解。JavaCPU。處于運(yùn)行狀態(tài)的線程會(huì)一直運(yùn)行,直至它不得不放棄CPU。26、什么是線程組,為什么在Java中不推薦使27、為什么使用Executor框架比使用應(yīng)用創(chuàng)建和為什么要使用Executor1newThread()比較消耗性能,創(chuàng)建一個(gè)線程是比較2newThread()創(chuàng)建的線程缺乏管理,被稱為野線程,而且可以無限制3newThread()使用Executor23綜上所述使用線程池框架Executor28、java繼承Thread實(shí)現(xiàn)Runnable實(shí)現(xiàn)Callable接口,需要實(shí)現(xiàn)的是call()29使用interruptThread.join()方法,或者Thread.sleep()方法,在網(wǎng)絡(luò)中調(diào)用ServerSocket.accept()方法,或者調(diào)用了DatagramSocket.receive()方法true,但該線程此時(shí)根本無法檢查循環(huán)標(biāo)志,當(dāng)然stop()方法,而是使用Threadinterrupt()方法,因?yàn)樵摲椒m然不會(huì)中斷一個(gè)正在運(yùn)行的線30、notify()和notifyAll()當(dāng)一個(gè)線程進(jìn)入wait之后,就必須等其他線程notify/notifyall,使用notifyall,wait中,而notify只能喚醒一個(gè)。如果沒把握,建議notifyAll,防止notigy31、什么是Daemon線程?它有什么意義?finallyrun()方法。比如:JVM的垃圾回收線程就是Daemon線程,F(xiàn)inalizer32、java33、什么是可重入鎖publicclassLocklock=newpublicvoidpublicvoid//dosomethingouter中調(diào)用了inner,outer先鎖住了lock,這樣inner就不能再獲取lock。其實(shí)調(diào)用outer的線程已經(jīng)獲取了lock鎖,但是不能在inner中重synchronized、ReentrantLock34、當(dāng)一個(gè)線程進(jìn)入某個(gè)對(duì)象的一個(gè)synchronized的實(shí)例方法后,其它線程是否可進(jìn)入此對(duì)象的其它方法?如果其他方法沒有synchronized讀鎖,寫鎖等,都是在做操作之前先上鎖。再比如Java里面的同步原語synchronized關(guān)鍵字的實(shí)現(xiàn)也是悲觀鎖。write_condition鎖。在Javajava.util.concurrent.atomic包下面的原子變量類就是使用了樂觀鎖的一種實(shí)現(xiàn)方式CAS實(shí)現(xiàn)的。12、java中的CompareandSwap即CAS,當(dāng)多個(gè)線程嘗試使用CAS同時(shí)更敗的線程并不會(huì)被掛起,而是被告知這次競(jìng)爭(zhēng)中失敗,并可以再次嘗試。CAS操作中包含三個(gè)操作數(shù)——需要讀寫的內(nèi)存位置(V)(A)和擬寫入的新值(B)VA處理器會(huì)自動(dòng)將該位置值更新為新值B。否則處理器不做任何操作。CAS1、ABAoneVA,twoA,twoB,twoVA,oneCASA,one作成功。盡管線程one的CAS操作成功,但可能存在潛藏的問題。從Java1.5開始JDK的atomicAtomicStampedReference來解決ABA問題。2對(duì)于資源競(jìng)爭(zhēng)嚴(yán)重(線程沖突嚴(yán)重)的情況,CAS浪費(fèi)更多的CPU資源,效率低于synchronized3當(dāng)對(duì)一個(gè)共享變量執(zhí)行操作時(shí),我們可以使用循環(huán)CAS的方式來保證原子操CAS36、SynchronizedMap和ConcurrentHashMap有什SynchronizedMap來訪為map。ConcurrentHashMap使用分段鎖來保證在多線程下的性能。ConcurrentHashMapConcurrentHashMaphash表分為16個(gè)桶,諸如get,put,remove等常用操作只鎖當(dāng)前需要用到的桶。這樣,原來只能一個(gè)線程進(jìn)入,現(xiàn)在卻能同時(shí)有16個(gè)寫線程執(zhí)行,并發(fā)性能ConcurrentHashMapiterator被創(chuàng)建后集合再發(fā)生改變就不再是拋出ConcurrentModificationException,取而代之的是在改變時(shí)new新的數(shù)據(jù)從而不影響原有的數(shù)據(jù),iterator完成后再將頭指針替換為新的數(shù)據(jù),這樣iterator37、CopyOnWriteArrayList可以用于什么應(yīng)用場(chǎng)這個(gè)列表時(shí),不會(huì)拋出ConcurrentModificationException。在CopyOnWriteArrayList的情況下,可能導(dǎo)致younggc或者fullgc;setCopyOnWriteArrayList能做到最CopyOnWriteArrayList12338、什么叫線程安全?servletServlet,servletStruts2actionnew一個(gè)新的action分配給這個(gè)請(qǐng)求,請(qǐng)求完成后銷毀。SpringMVC的Controller是線程安全的嗎?不是的,和ServletStruts2;ServletSpringMVC安全問題,但是性能可以提升不用處理太多的gc,可以使用ThreadLocal來39、volatile有什么用?能否用一句話說明下volatile的應(yīng)用場(chǎng)景?volatilevolatile4041、在java中wait和sleep方法的不同?waitsleepWait用于線程間交互,sleep通常被用于暫停執(zhí)行。42、用Java實(shí)現(xiàn)阻塞隊(duì)列43異常將造成線程中斷的時(shí)候JVM會(huì)使用UncaughtExceptionHandlerhandler的4445、Java中notify和notifyAll有什么區(qū)別?notify()有用武之地。而notifyAll()喚醒所有線程并允許他們爭(zhēng)奪鎖確保了至少有一46、為什么wait,notify和notifyAll這些方法不在thread一個(gè)很明顯的原因是JAVA提供的鎖是對(duì)象級(jí)的而不是線程級(jí)的,每個(gè)對(duì)象都wait,notifynotifyAll所以把他們定義在Object類中因?yàn)殒i屬于對(duì)象。47、什么是ThreadLocal變量?ThreadLocalJavaThreadLocal建代價(jià)高昂的對(duì)象獲取線程安全的好方法,比如你可以用ThreadLocal讓SimpleDateFormat48、Java中interrupted和isInterrupted方法interruptinterruptedException)就是在監(jiān)視線程的中斷狀態(tài),一旦線程的中斷調(diào)用interrupted則返回true,第二次和后面的就返回false了。49、為什么wait和notify方法要在同步塊中調(diào)JavaAPI強(qiáng)制要求這樣做,如果你不這么做,你的代碼會(huì)拋出IllegalMonitorStateExceptionwaitnotify5051、JavaJava1.5程并發(fā)的時(shí)候會(huì)導(dǎo)致爭(zhēng)用,阻礙了系統(tǒng)的擴(kuò)展性。Java5介紹了并發(fā)集合像52、什么是線程池?JDK1.5,JavaAPIExecutor53java.lang.ThreadholdsLock(),true54、你如何在Java中獲取線程堆棧?kill-3[java不會(huì)在當(dāng)前終端輸出,它會(huì)輸出到代碼執(zhí)行的或指定的地方去。比如,kill-tomcatpid,logJstack[javapid]-JvisualVM:Thread不做說明,打開JvisualVM55、JVM-Xss56、Thread類中的yield方法有什么作用?使當(dāng)前線程從執(zhí)行狀態(tài)(運(yùn)行狀態(tài))變?yōu)榭蓤?zhí)行態(tài)(就緒狀態(tài))57、Java中ConcurrentHashMap的并發(fā)度是什ConcurrentHashMapmapConcurrentHashMap個(gè)可選參數(shù),默認(rèn)值為16,這樣在多線程情況下就能避免爭(zhēng)用。JDK8Segment(鎖段)的概念,而是啟用了一種全新的方式CAS58、Java中Semaphore是什么?JavaSemaphoreacquire(),release()添加一個(gè)許可,從而可能釋放一個(gè)正在阻塞的獲取者。但是,不使用實(shí)際的許可對(duì)象,Semaphore59、Java線程池中submit()和execute()方法有兩個(gè)方法都可以向線程池提交任務(wù),execute()方法的返回類型是void,Executor而submit()方法可以返回持有計(jì)算結(jié)果的Future對(duì)象,它定義在ExecutorService接口中,它擴(kuò)展了Executor接口,其它線程池類像ThreadPoolExecutorScheduledThreadPoolExecutor60accept()方法就是一直等待客戶端連接。這里的阻塞是指調(diào)用結(jié)果返回之61、Java中的ReadWriteLock是什么?62、volatile變量和atomic變量有什么不同?Volatile并不能保證原子性。例如用volatile修飾count變量那么count++操作就而AtomicInteger類提供的atomic方法可以讓這種操作具有原子性如63、可以直接調(diào)用Thread類的run()方法么?Threadrun()方法,它的行為就會(huì)和普通Thread.start()方法。64我們可以使用Thread類的Sleep()方法讓線程暫停一段時(shí)間。需要注意的65int1-10

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論