手册

目录

Java.io 包教程

Java synchronized 关键字

收藏980

阅读811

更新时间2025-07-22

前言:

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

定义和用法

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

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

教程: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;
    }
  }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

科技资讯

更多

精选课程

更多
前端入门_HTML5
前端入门_HTML5

共29课时

61.7万人学习

CSS视频教程-玉女心经版
CSS视频教程-玉女心经版

共25课时

39.3万人学习

JavaScript极速入门_玉女心经系列
JavaScript极速入门_玉女心经系列

共43课时

70.9万人学习

独孤九贱(1)_HTML5视频教程
独孤九贱(1)_HTML5视频教程

共25课时

61.6万人学习

独孤九贱(2)_CSS视频教程
独孤九贱(2)_CSS视频教程

共22课时

23万人学习

独孤九贱(3)_JavaScript视频教程
独孤九贱(3)_JavaScript视频教程

共28课时

33.9万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时

125万人学习

关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号