Java并發(fā)編程面試要點解析_第1頁
Java并發(fā)編程面試要點解析_第2頁
Java并發(fā)編程面試要點解析_第3頁
Java并發(fā)編程面試要點解析_第4頁
Java并發(fā)編程面試要點解析_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Java并發(fā)編程面試要點解析一、并發(fā)基礎(chǔ)概念Java并發(fā)編程的核心在于理解并發(fā)與并行的區(qū)別。并發(fā)是指多個任務(wù)在宏觀上看起來是同時執(zhí)行,實際上可能是交替執(zhí)行;而并行則是多個任務(wù)在微觀上同時執(zhí)行。Java通過多線程機制實現(xiàn)并發(fā),允許程序同時處理多個任務(wù)。Java的線程模型基于搶占式多任務(wù)處理,線程調(diào)度由虛擬機管理。線程狀態(tài)包括新建(NEW)、就緒(RUNNABLE)、運行(RUNNING)、阻塞(BLOCKED)、等待(WAITING)、timedwaiting(TIMED_WAITING)和終止(TERMINATED)。理解這些狀態(tài)對于處理線程生命周期至關(guān)重要。二、Java線程創(chuàng)建與執(zhí)行創(chuàng)建線程有兩種主要方式:繼承Thread類或?qū)崿F(xiàn)Runnable接口。推薦使用Runnable接口,因為它避免了單繼承的限制,更符合面向?qū)ο笤O(shè)計原則。java//繼承Thread類classMyThreadextendsThread{publicvoidrun(){//線程執(zhí)行內(nèi)容}}//實現(xiàn)Runnable接口classMyRunnableimplementsRunnable{publicvoidrun(){//線程執(zhí)行內(nèi)容}}線程執(zhí)行通過start()方法啟動,該方法內(nèi)部會調(diào)用run()方法。直接調(diào)用run()方法不會創(chuàng)建新線程,而是在當前線程中執(zhí)行。線程優(yōu)先級從1到10,默認為5,可以通過setPriority()方法調(diào)整。三、線程同步機制1.synchronized關(guān)鍵字`synchronized`是Java最常用的同步機制,可以修飾方法或代碼塊。同步方法作用于當前對象實例,而同步代碼塊作用于指定同步監(jiān)視器對象。java//同步方法publicsynchronizedvoidsyncMethod(){//方法體}//同步代碼塊publicvoidsyncBlock(){synchronized(this){//代碼體}}`synchronized`具有原子性、可見性和有序性。原子性指同步代碼塊內(nèi)的操作要么全部執(zhí)行,要么全部不執(zhí)行??梢娦灾妇€程A修改了共享變量的值,其他線程能立即得知。有序性防止指令重排。2.Lock接口與實現(xiàn)類`java.util.concurrent.locks.Lock`接口提供了比`synchronized`更靈活的鎖操作。常用實現(xiàn)類包括`ReentrantLock`和`ReentrantReadWriteLock`。javaLocklock=newReentrantLock();lock.lock();try{//臨界區(qū)代碼}finally{lock.unlock();}`ReentrantLock`支持可中斷獲取鎖、可超時獲取鎖、公平鎖和非公平鎖。`ReentrantReadWriteLock`允許多個線程同時讀取,但只允許一個線程寫入,提高并發(fā)性能。3.Condition接口`java.util.concurrent.locks.Condition`與`ReentrantLock`配合使用,提供更精細的線程等待/通知機制。javaConditioncondition=lock.newCondition();lock.lock();try{condition.await();//等待condition.signal();//通知condition.signalAll();//全部通知}finally{lock.unlock();}4.其他同步工具`java.util.concurrent`包提供了多種同步工具:-`CountDownLatch`:一個線程等待多個線程執(zhí)行完畢-`CyclicBarrier`:多個線程互相等待,達到指定數(shù)量后共同執(zhí)行-`Semaphore`:控制同時訪問特定資源的線程數(shù)量四、并發(fā)容器1.Vector與HashtableJava早期提供的線程安全容器,通過內(nèi)部加鎖實現(xiàn)同步,性能較低。javaVector<String>vector=newVector<>();Hashtable<String,String>hashtable=newHashtable<>();2.Collections.synchronizedXXX()對普通容器進行包裝,使其線程安全:javaList<String>syncList=Collections.synchronizedList(newArrayList<>());Map<String,String>syncMap=Collections.synchronizedMap(newHashMap<>());3.Concurrent集合框架`java.util.concurrent`包提供了性能更高的并發(fā)集合:-`ConcurrentHashMap`:分段鎖實現(xiàn)高性能并發(fā)Map-`CopyOnWriteArrayList`:寫時復制,讀操作不加鎖-`CopyOnWriteArraySet`:基于寫時復制的Set實現(xiàn)-`BlockingQueue`:支持阻塞操作的隊列javaConcurrentHashMap<String,String>cmap=newConcurrentHashMap<>();BlockingQueue<String>queue=newLinkedBlockingQueue<>();4.并發(fā)集合特性并發(fā)集合通常支持以下特性:-可伸縮性:支持高并發(fā)場景-原子性:確保操作不可中斷-非阻塞:盡量減少線程阻塞-線程安全:無需外部同步五、線程池與任務(wù)執(zhí)行1.Executor框架Java提供了`java.util.concurrent.Executor`框架管理線程執(zhí)行:javaExecutorServiceexecutor=Executors.newFixedThreadPool(10);executor.submit(newRunnable(){publicvoidrun(){//任務(wù)代碼}});2.ExecutorService類型-`Executors.newFixedThreadPool(intnThreads)`:固定大小線程池-`Executors.newCachedThreadPool()`:可緩存線程池-`Executors.newSingleThreadExecutor()`:單線程執(zhí)行器-`Executors.newScheduledThreadPool(intcorePoolSize)`:定時任務(wù)執(zhí)行器3.線程池工作原理線程池包含核心線程數(shù)、最大線程數(shù)、工作隊列和拒絕策略。當任務(wù)提交時:1.如果核心線程空閑,立即執(zhí)行任務(wù)2.如果核心線程都在工作,將任務(wù)放入工作隊列3.如果工作隊列滿,根據(jù)拒絕策略處理任務(wù)4.線程池配置javaThreadPoolExecutorexecutor=newThreadPoolExecutor(5,//核心線程數(shù)10,//最大線程數(shù)60,//空閑線程存活時間TimeUnit.SECONDS,newLinkedBlockingQueue<>(20),//工作隊列Executors.defaultThreadFactory(),//線程工廠newThreadPoolExecutor.CallerRunsPolicy()//拒絕策略);5.線程池狀態(tài)線程池有5種狀態(tài):新建(NEW)、運行中(RUNNING)、阻塞(BLOCKED)、關(guān)閉(SHUTDOWN)和終止(TERMINATED)。六、并發(fā)編程最佳實踐1.避免死鎖死鎖條件:互斥、占有并等待、非搶占、循環(huán)等待。預防措施:-使用固定順序申請鎖-使用`tryLock()`嘗試獲取鎖-使用`ReentrantLock`的`公平鎖`-使用`Lock`的`Condition`替代`synchronized`2.減少鎖競爭-使用細粒度鎖:將大鎖分解為小鎖-使用`ReadWriteLock`:讀多寫少場景-使用`ConcurrentHashMap`的原子操作-使用`volatile`保證可見性,減少鎖需求3.避免線程泄漏線程泄漏是指線程被無限期阻塞或無法正常終止。預防措施:-使用`try-finally`確保資源釋放-使用`CompletableFuture`處理異步任務(wù)-避免長時間阻塞操作-定期檢查守護線程狀態(tài)4.異步編程Java異步編程主要方式:-`Future`接口:表示異步計算結(jié)果-`Callable`接口:帶返回值的任務(wù)-`CompletableFuture`:強大的異步處理工具javaFuture<String>future=executor.submit(newCallable<String>(){publicStringcall()throwsException{return"result";}});//獲取結(jié)果Stringresult=future.get();5.原子操作使用`java.util.concurrent.atomic`包下的類實現(xiàn)無鎖原子操作:javaAtomicIntegeratomicInt=newAtomicInteger(0);atomicInt.incrementAndGet();//原子自增常用類:`AtomicInteger`,`AtomicLong`,`AtomicReference`,`AtomicStampedReference`七、常見面試題解析1.synchronized與Lock的區(qū)別|特性|synchronized|Lock|||-|||性能|較低,自動獲取/釋放|較高,需手動管理||可中斷|獲取鎖不可中斷|可中斷獲取||可超時|不可超時獲取|可超時獲取||公平性|非公平|可配置公平性||條件變量|支持,但較弱|支持,功能強大|2.ThreadLocal原理`ThreadLocal`為每個線程提供獨立實例副本,通過`ThreadLocalMap`存儲線程本地變量。使用時需注意內(nèi)存泄漏問題。javaThreadLocal<String>threadLocal=newThreadLocal<>();threadLocal.set("value");Stringvalue=threadLocal.get();3.ConcurrentHashMap實現(xiàn)原理`ConcurrentHashMap`使用分段鎖(Segment)實現(xiàn)并發(fā),每個Segment是獨立的哈希表。JDK8進一步優(yōu)化為CAS+synchronized,提高了并發(fā)性能。4.線程池參數(shù)配置javaThreadPoolExecutorexecutor=newThreadPoolExecutor(2,//核心線程數(shù)5,//最大線程數(shù)60,//空閑存活時間TimeUnit.SECONDS,newArrayBlockingQueue<>(10),//隊列Executors.defaultThreadFactory(),newThreadPoolExecutorAbortPolicy()//拒絕策略);常用拒絕策略:-`AbortPolicy`:拋出RejectedExecutionException-`CallerRunsPolicy`:調(diào)用者線程執(zhí)行任務(wù)-`DiscardPolicy`:直接丟棄任務(wù)-`DiscardOldestPolicy`:丟棄隊列最舊任務(wù)5.AQS原理`AbstractQueuedSynchronizer`是Java鎖機制的基礎(chǔ)框架,使用CAS和volatile實現(xiàn)線程安全隊列。主要方法:-`acquire()`:獲取鎖-`release()`:釋放鎖-`isLocked()`:檢查是否鎖定-`hasQueuedThreads()`:檢查隊列是否為空八、實戰(zhàn)案例1.電商秒殺系統(tǒng)秒殺系統(tǒng)需要處理高并發(fā)請求,關(guān)鍵點:-使用分布式鎖避免超賣-設(shè)置請求上限,防止系統(tǒng)過載-使用Redis緩存熱點商品信息-異步處理訂單,提高響應(yīng)速度javapublicbooleanseckill(Productproduct,Useruser){//分布式鎖Locklock=redisson.getLock("product:"+product.getId());try{if(lock.tryLock(10,TimeUnit.SECONDS)){if(product.getStock()>0){product.setStock(product.getStock()-1);//創(chuàng)建訂單returntrue;}returnfalse;}}finally{lock.unlock();}returnfalse;}2.數(shù)據(jù)庫連接池數(shù)據(jù)庫連接池實現(xiàn)要點:-控制最大連接數(shù),避免資源耗盡-連接驗證,復用有效連接-異步獲取連接,提高性能-連接泄漏檢測與回收javapublicConnectiongetConnection()throwsSQLException{try{//獲取連接returnpool.getConnection();}catch(Exceptione){//記錄日志returnpool.getNewConnection();

溫馨提示

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

評論

0/150

提交評論