
在月薪過萬的Java工程師面試中,線程問題是必考的重災(zāi)區(qū)。本文用15分鐘帶你掌握線程核心知識,文末附贈(zèng)「高并發(fā)場景優(yōu)化指南」!
一、為什么線程是Java程序員的分水嶺?
性能提升:單核CPU實(shí)現(xiàn)網(wǎng)頁多標(biāo)簽同時(shí)加載
資源利用:數(shù)據(jù)庫連接池復(fù)用技術(shù)背后的秘密
用戶體驗(yàn):微信消息接收和輸入同時(shí)進(jìn)行的奧秘
二、線程 vs 進(jìn)程:快遞站的精妙比喻
維度 | 進(jìn)程 | 線程 |
---|
資源開銷 | 獨(dú)立內(nèi)存空間(500MB起) | 共享內(nèi)存(1MB內(nèi)) |
切換成本 | 需要切換頁表(高) | 僅切換程序計(jì)數(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啟動(dòng)!");}}
實(shí)現(xiàn)Runnable接口(推薦):避免單繼承限制
newThread(()->System.out.println("Lambda表達(dá)式更簡潔")).start();
Callable+Future:需要返回值時(shí)使用
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人同時(shí)搶100件商品
文件批量處理:同時(shí)轉(zhuǎn)換100個(gè)PDF文檔
監(jiān)控系統(tǒng):每秒采集100臺服務(wù)器指標(biāo)
高頻面試題精選
sleep()和wait()有什么區(qū)別?
如何優(yōu)雅地停止線程?
ThreadLocal會(huì)引發(fā)內(nèi)存泄漏嗎?