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; } } }