首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 線程安全全解析:四種同步方式與五大安全等級

     編輯:Java 相關知識

四種同步鎖機制

Java 通過 synchronized 關鍵字提供四種鎖粒度:

  1. synchronized method() — 鎖當前對象實例
  2. synchronized (objectReference) { /* block */ } — 鎖指定對象
  3. static synchronized method() — 鎖類對象(Class 對象)
  4. synchronized (ClassName.class) { /* block */ } — 鎖類對象

關鍵點:1 和 2 鎖的是對象實例(一個對象一把鎖);3 和 4 鎖的是類(該類所有實例共享一把鎖)。synchronized method 鎖的是對象而非方法本身——若兩個線程共享同一引用,調用該類任意 synchronized 方法都會互斥。

協調多方法調用順序

若需保證兩個方法調用順序不可被打斷,可引入專用鎖對象:

class MyLock {
    private final Object lock = new Object();
    public void doInOrder() {
        synchronized(lock) {
            // 先調用 methodA 再調用 methodB,順序不可被打斷
        }
    }
}

五大線程安全等級

參考 Effective Java Item 52:

  1. Immutable(不可變):如 String、Integer,天生線程安全。
  2. Thread-safe(線程安全):如 java.util.Timer,內部同步,可直接並發使用。
  3. Conditionally thread-safe(條件線程安全):如 Vector、Hashtable,單方法安全,但複合操作需外部同步。
  4. Thread-compatible(線程兼容):自身無同步,但可通過 synchronized 輔助實現安全。
  5. Thread-hostile(線程敵對):無論如何都無法安全使用,極少見。

wait/notify 最佳實踐

  • 始終在循環中調用 wait(),防止虛假喚醒。
  • 優先使用 notifyAll() 而非 notify(),避免信號丟失。

管道通信

Java 提供四個管道類實現生產者-消費者模式:

PipedOutputStream pout1 = new PipedOutputStream();
PipedInputStream pin1 = new PipedInputStream(pout1);
PipedOutputStream pout2 = new PipedOutputStream();
PipedInputStream pin2 = new PipedInputStream(pout2);

Producer prod = new Producer(pout1);
Filter filt = new Filter(pin1, pout2);
Consumer cons = new Consumer(pin2);

prod.start(); filt.start(); cons.start();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved