
在月薪過萬的Java工程師面試中,線程問題是必考的重災(zāi)區(qū)。本文用15分鐘帶你掌握線程核心知識,文末附贈「高并發(fā)場景優(yōu)化指南」!
一、為什么線程是Java程序員的分水嶺?
二、線程 vs 進程:快遞站的精妙比喻
維度 | 進程 | 線程 |
---|
資源開銷 | 獨立內(nèi)存空間(500MB起) | 共享內(nèi)存(1MB內(nèi)) |
切換成本 | 需要切換頁表(高) | 僅切換程序計數(shù)器(低) |
通信方式 | Socket/管道(慢) | 共享變量(快) |
三、線程生命周期全景圖
newThread(()->{synchronized(lock){try{Thread.sleep(1000);}catch(InterruptedException e){Thread.currentThread().interrupt();}}}).start();
四、3種創(chuàng)建方式**選擇指南
繼承Thread類:適合簡單場景
classMyThreadextendsThread{publicvoidrun(){System.out.println("Thread啟動!");}}
實現(xiàn)Runnable接口(推薦):避免單繼承限制
newThread(()->System.out.println("Lambda表達式更簡潔")).start();
Callable+Future:需要返回值時使用
FutureTask<Integer> task =newFutureTask<>(()->{Thread.sleep(2000);return42;});newThread(task).start();System.out.println(task.get());
五、線程安全三大**解決方案
同步監(jiān)視器(synchronized)
publicclassSingleton{privatevolatilestaticSingleton instance;publicstaticSingletongetInstance(){if(instance ==null){synchronized(Singleton.class){if(instance ==null){
instance =newSingleton();}}}return instance;}}
Lock顯式鎖(更靈活)
ReentrantLock lock =newReentrantLock();
lock.lock();try{}finally{
lock.unlock();}
原子類(性能**)
AtomicInteger count =newAtomicInteger();
count.incrementAndGet();
六、線程池的七大參數(shù)詳解
ExecutorService pool =newThreadPoolExecutor(5,10,60L,TimeUnit.SECONDS,newLinkedBlockingQueue<>(100),Executors.defaultThreadFactory(),newThreadPoolExecutor.AbortPolicy());
七、典型應(yīng)用場景
電商秒殺:1000人同時搶100件商品
文件批量處理:同時轉(zhuǎn)換100個PDF文檔
監(jiān)控系統(tǒng):每秒采集100臺服務(wù)器指標
高頻面試題精選
sleep()和wait()有什么區(qū)別?
如何優(yōu)雅地停止線程?
ThreadLocal會引發(fā)內(nèi)存泄漏嗎?