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

[JAVA100例] 第65例:線程同步——synchronized 關鍵字保護共享數據

     編輯:Java 相關知識

本例演示使用 synchronized 關鍵字實現線程同步:兩個線程並發操作共享賬戶對象(一個存款、一個取款),通過同步方法保證數據一致性。

核心代碼

public class SyThreadDemo {
  public static void main(String[] args) {
    trade ft = new trade();
    addThread tt1 = new addThread(ft, "add");
    decThread tt2 = new decThread(ft, "dec");
    tt1.start(); tt2.start();
  }
}

class trade {
  private String transName;
  private double amount;

  // 同步方法:同一時間只允許一個線程執行
  synchronized void update(String transName, double amount) {
    this.transName = transName;
    this.amount = amount;
    System.out.println(this.transName + " " + this.amount);
  }
}

class addThread extends Thread {
  private trade ft;
  addThread(trade ft, String name) { super(name); this.ft = ft; }
  public void run() {
    for (int i = 0; i < 10; i++) ft.update("add", 2000.0);
  }
}

class decThread extends Thread {
  private trade fd;
  decThread(trade fd, String name) { super(name); this.fd = fd; }
  public void run() {
    for (int i = 0; i < 10; i++) fd.update("dec", -2000.0);
  }
}

同步機制深度解析

  1. 對象鎖:synchronized 實例方法鎖住 this 對象,同一對象的所有同步方法互斥
  2. 可重入性:同一線程可重複獲取已持有的鎖
  3. 內存可見性:同步塊結束時將工作內存刷新到主內存,保證其他線程見到最新值
  4. 原子性:同步塊內代碼對其他線程不可分割

兩種同步寫法對比

// 1. 同步實例方法(鎖 this)
synchronized void update(...) { ... }

// 2. 同步代碼塊(可指定鎖對象,粒度更細)
void update(...) {
  synchronized(this) { ... }  // 或 synchronized(sharedLock) { ... }
}

// 3. 同步靜態方法(鎖 Class 對象)
static synchronized void staticMethod() { ... }

運行結果分析

輸出將嚴格交替顯示 "add 2000.0" 和 "dec -2000.0",無數據競爭。若去掉 synchronized,可能出現:

  • transName 被覆寫導致操作類型與金額不匹配
  • amount 讀取到中間狀態值

現代並發增強工具

工具適用場景優勢
ReentrantLock需可中斷、超時、公平鎖、多條件變量功能豐富、性能優於 synchronized(高爭用時)
AtomicLong/Double單變量原子操作無鎖 CAS,極高性能
LongAdder高併發計數器分段累加,吞吐量遠超 AtomicLong
StampedLock讀多寫少場景樂觀讀鎖,無阻塞讀取

最佳實踐原則

  1. 優先使用 不可變對象 避免同步
  2. 縮小同步範圍(同步代碼塊優於同步方法)
  3. 避免在同步塊中調用異步/耗時操作
  4. 固定鎖獲取順序防死鎖
  5. 考慮 java.util.concurrent 高級組件替代底層同步
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved