Java synchronized 关键字
示例
使用 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("Total before: " + (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("Total after: " + (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;
}
}
}
定义和用法
synchronized关键字是一个修饰符,它会锁定一个方法,使其一次只能被一个线程使用。这可以防止线程间竞争条件导致的问题。
在上面的示例中,如果从transfer()方法中移除synchronized关键字,可能会导致a和b的值在两次操作之间被另一个线程修改。这将导致这两个变量之间的总值发生变化。
相关页面
阅读我们的Java 修饰符教程,了解更多关于修饰符的信息。
阅读我们的Java线程教程,了解更多关于线程的信息。

