溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java多線程知識點有哪些

發布時間:2021-11-16 09:39:46 來源:億速云 閱讀:156 作者:iii 欄目:大數據
# 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);

2.2 線程狀態轉換

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()結束

三、線程同步與鎖機制

3.1 synchronized關鍵字

  • 修飾實例方法:鎖是當前實例對象
  • 修飾靜態方法:鎖是當前類的Class對象
  • 同步代碼塊:可指定鎖對象
// 實例方法同步
public synchronized void method() {}

// 靜態方法同步
public static synchronized void staticMethod() {}

// 同步代碼塊
public void block() {
    synchronized(lockObj) {
        // 臨界區代碼
    }
}

3.2 Lock接口及其實現類

Lock lock = new ReentrantLock();
lock.lock();
try {
    // 臨界區代碼
} finally {
    lock.unlock(); // 必須手動釋放
}
  • 相比synchronized的優勢:
    • 可中斷獲取鎖
    • 超時獲取鎖
    • 公平鎖/非公平鎖選擇
    • 多個條件變量

3.3 volatile關鍵字

  • 保證可見性:修改立即對其他線程可見
  • 禁止指令重排序
  • 不保證原子性(適合狀態標志位場景)

四、線程間通信

4.1 wait/notify機制

synchronized(lock) {
    while(條件不滿足) {
        lock.wait(); // 釋放鎖并等待
    }
    // 處理業務
    lock.notifyAll(); // 喚醒其他線程
}

4.2 Condition接口

Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();

lock.lock();
try {
    condition.await(); // 類似wait()
    condition.signal(); // 類似notify()
} finally {
    lock.unlock();
}

五、并發工具類

5.1 CountDownLatch

CountDownLatch latch = new CountDownLatch(3);
// 工作線程
latch.countDown(); 
// 主線程
latch.await(); // 阻塞直到計數器歸零

5.2 CyclicBarrier

CyclicBarrier barrier = new CyclicBarrier(3, ()->{
    // 所有線程到達后執行的回調
});

// 工作線程
barrier.await(); // 等待其他線程

5.3 Semaphore

Semaphore semaphore = new Semaphore(5); // 許可證數量
semaphore.acquire(); // 獲取許可
try {
    // 受限資源訪問
} finally {
    semaphore.release(); // 釋放許可
}

六、線程池體系

6.1 Executor框架結構

Executor
├── ExecutorService
│   ├── AbstractExecutorService
│   │   └── ThreadPoolExecutor
│   └── ScheduledExecutorService
│       └── ScheduledThreadPoolExecutor
└── ForkJoinPool

6.2 核心參數解析

new ThreadPoolExecutor(
    corePoolSize,    // 核心線程數
    maximumPoolSize, // 最大線程數
    keepAliveTime,  // 空閑線程存活時間
    unit,           // 時間單位
    workQueue,      // 任務隊列
    threadFactory,  // 線程工廠
    handler         // 拒絕策略
);

6.3 四種拒絕策略

  • AbortPolicy(默認):拋出RejectedExecutionException
  • CallerRunsPolicy:由調用者線程執行
  • DiscardPolicy:直接丟棄任務
  • DiscardOldestPolicy:丟棄隊列中最老的任務

七、并發集合類

7.1 ConcurrentHashMap

  • JDK8+實現:數組+鏈表+紅黑樹+CAS+synchronized
  • 并發控制:
    • 分段鎖思想(JDK7)
    • 桶首節點鎖(JDK8+)

7.2 CopyOnWriteArrayList

  • 讀操作無鎖
  • 寫操作復制新數組
  • 適合讀多寫少場景

7.3 BlockingQueue實現類

  • ArrayBlockingQueue:數組實現的有界隊列
  • LinkedBlockingQueue:鏈表實現的可選有界隊列
  • PriorityBlockingQueue:支持優先級的無界隊列
  • SynchronousQueue:不存儲元素的特殊隊列

八、原子操作類

8.1 基本類型原子類

  • AtomicInteger
  • AtomicLong
  • AtomicBoolean

8.2 數組原子類

  • AtomicIntegerArray
  • AtomicLongArray
  • AtomicReferenceArray

8.3 CAS原理

// 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);

九、常見并發問題

9.1 死鎖條件與預防

  • 必要條件:
    1. 互斥條件
    2. 請求與保持
    3. 不可剝奪
    4. 循環等待
  • 預防方案:
    • 鎖排序
    • 超時機制
    • 死鎖檢測

9.2 線程安全設計原則

  1. 優先使用不可變對象
  2. 縮小同步范圍
  3. 使用線程安全類
  4. 避免暴露內部狀態
  5. 考慮使用并發容器

十、Java內存模型(JMM)

10.1 happens-before規則

  • 程序順序規則
  • 鎖規則
  • volatile變量規則
  • 線程啟動規則
  • 傳遞性規則

10.2 內存屏障類型

  • LoadLoad屏障
  • StoreStore屏障
  • LoadStore屏障
  • StoreLoad屏障

最佳實踐提示:多線程編程應遵循”先保證正確性,再考慮優化性能”的原則。JDK并發包中的工具類已經經過充分驗證,優先使用這些高級工具而非自己造輪子。 “`

(注:實際字數約1800字,核心內容已涵蓋主要知識點,可根據需要調整細節)

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女