# Java多線程知識點有哪些
## 一、多線程基礎概念
### 1.1 進程與線程的區別
- **進程**:操作系統資源分配的基本單位,每個進程有獨立的內存空間
- **線程**:CPU調度的基本單位,同一進程內的線程共享內存空間
- 關鍵區別:
- 進程間通信需要IPC機制
- 線程切換開銷小于進程
- 線程更輕量級
### 1.2 為什么需要多線程
- 提高CPU利用率(特別是多核處理器)
- 改善程序響應性(如GUI應用)
- 簡化異步任務處理模型
- 現代服務器的基本要求(如Tomcat線程池)
## 二、線程創建與生命周期
### 2.1 創建線程的三種方式
```java
// 方式1:繼承Thread類
class MyThread extends Thread {
public void run() {
// 線程執行邏輯
}
}
// 方式2:實現Runnable接口
class MyRunnable implements Runnable {
public void run() {
// 線程執行邏輯
}
}
// 方式3:使用Callable+FutureTask
Callable<Integer> callable = () -> {
// 可返回結果的線程
return 42;
};
FutureTask<Integer> futureTask = new FutureTask<>(callable);
stateDiagram
[*] --> NEW
NEW --> RUNNABLE: start()
RUNNABLE --> BLOCKED: 等待鎖
BLOCKED --> RUNNABLE: 獲取鎖
RUNNABLE --> WTING: wait()/join()
WTING --> RUNNABLE: notify()/notifyAll()
RUNNABLE --> TIMED_WTING: sleep(n)/wait(n)
TIMED_WTING --> RUNNABLE: 超時/喚醒
RUNNABLE --> TERMINATED: run()結束
// 實例方法同步
public synchronized void method() {}
// 靜態方法同步
public static synchronized void staticMethod() {}
// 同步代碼塊
public void block() {
synchronized(lockObj) {
// 臨界區代碼
}
}
Lock lock = new ReentrantLock();
lock.lock();
try {
// 臨界區代碼
} finally {
lock.unlock(); // 必須手動釋放
}
synchronized(lock) {
while(條件不滿足) {
lock.wait(); // 釋放鎖并等待
}
// 處理業務
lock.notifyAll(); // 喚醒其他線程
}
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
lock.lock();
try {
condition.await(); // 類似wait()
condition.signal(); // 類似notify()
} finally {
lock.unlock();
}
CountDownLatch latch = new CountDownLatch(3);
// 工作線程
latch.countDown();
// 主線程
latch.await(); // 阻塞直到計數器歸零
CyclicBarrier barrier = new CyclicBarrier(3, ()->{
// 所有線程到達后執行的回調
});
// 工作線程
barrier.await(); // 等待其他線程
Semaphore semaphore = new Semaphore(5); // 許可證數量
semaphore.acquire(); // 獲取許可
try {
// 受限資源訪問
} finally {
semaphore.release(); // 釋放許可
}
Executor
├── ExecutorService
│ ├── AbstractExecutorService
│ │ └── ThreadPoolExecutor
│ └── ScheduledExecutorService
│ └── ScheduledThreadPoolExecutor
└── ForkJoinPool
new ThreadPoolExecutor(
corePoolSize, // 核心線程數
maximumPoolSize, // 最大線程數
keepAliveTime, // 空閑線程存活時間
unit, // 時間單位
workQueue, // 任務隊列
threadFactory, // 線程工廠
handler // 拒絕策略
);
// AtomicInteger的getAndIncrement實現
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
// Unsafe類中的CAS操作
public final native boolean compareAndSwapInt(
Object obj, long offset, int expect, int update);
最佳實踐提示:多線程編程應遵循”先保證正確性,再考慮優化性能”的原則。JDK并發包中的工具類已經經過充分驗證,優先使用這些高級工具而非自己造輪子。 “`
(注:實際字數約1800字,核心內容已涵蓋主要知識點,可根據需要調整細節)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。