Java synchronized 关键字

定义和用法

synchronized 关键字是一个修饰符,用于锁定一个方法,以便一次只能有一个线程使用它。这可以防止线程之间因竞态条件而产生的问题。

在上面的例子中,如果从 transfer() 方法中移除 synchronized 关键字,可能会导致变量 a 和 b 的值在操作过程中被另一个线程修改。这将导致两个变量之间的总额发生变化。

相关页面

教程:Java 修饰符

教程:Java 线程

实例

使用 synchronized 修饰符来防止线程之间的竞态条件:

public class Main implements Runnable {
  public static int a, b;
 
  public static void main(String[] args) {
    a = 100;
    b = 100;
 
    // 在转账前检查 a 和 b 之间的总额
    System.out.println("转账前总额: " + (a + b));
 
    // 运行线程,将在 a 和 b 之间进行转账
    Thread thread1 = new Thread(new Main());
    Thread thread2 = new Thread(new Main());
    thread1.start();
    thread2.start();
 
    // 等待线程运行结束
    try {
      thread1.join();
      thread2.join();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
 
    // 在转账后检查 a 和 b 之间的总额
    // 应该与转账前相同
    System.out.println("转账后总额: " + (a + b));
  }
 
  public void run() {
    for (int i = 0; i < 10000000; i++) {
      transfer();
    }
  }
 
  public static synchronized void transfer() {
    // 选择一个随机金额进行转账
    int amount = (int) (5.0 * Math.random());
 
    // 在 a 和 b 之间进行转账
    if (a > b) {
      a -= amount;
      b += amount;
    } else {
      a += amount;
      b -= amount;
    }
  }
}

亲自试一试