当前位置:首页 > Java > 正文

Java同步方法详解(掌握synchronized关键字实现线程安全)

在多线程编程中,多个线程同时访问共享资源时可能会导致数据不一致或程序行为异常。为了解决这个问题,Java 提供了 同步机制,其中最常用的就是 synchronized 关键字。本教程将带你从零开始理解 Java同步方法,即使你是编程小白也能轻松上手。

Java同步方法详解(掌握synchronized关键字实现线程安全) Java同步方法  synchronized关键字 Java线程安全 多线程同步 第1张

什么是Java同步方法?

当一个方法被 synchronized 修饰后,它就变成了同步方法。这意味着在同一时刻,只能有一个线程可以执行该方法。其他试图调用该方法的线程必须等待,直到当前线程执行完毕并释放锁。

使用同步方法是保证 Java线程安全 的一种简单有效的方式。

同步方法的基本语法

在 Java 中,只需在方法声明前加上 synchronized 关键字即可:

public synchronized void myMethod() {    // 方法体    // 只能被一个线程同时访问}

对于实例方法,锁的是当前对象(this);对于静态方法,锁的是该类的 Class 对象。

实战示例:银行账户转账

假设我们有一个银行账户类,多个线程同时进行存款操作,如果不加同步,余额可能计算错误。下面是一个使用 同步方法 的正确实现:

public class BankAccount {    private double balance = 0.0;    // 同步方法:确保线程安全    public synchronized void deposit(double amount) {        if (amount > 0) {            balance += amount;            System.out.println(Thread.currentThread().getName() +                 " 存入 " + amount + ",当前余额:" + balance);        }    }    public double getBalance() {        return balance;    }}// 测试类public class Test {    public static void main(String[] args) {        BankAccount account = new BankAccount();        // 创建两个线程同时存款        Thread t1 = new Thread(() -> {            for (int i = 0; i < 5; i++) {                account.deposit(100);            }        }, "线程A");        Thread t2 = new Thread(() -> {            for (int i = 0; i < 5; i++) {                account.deposit(200);            }        }, "线程B");        t1.start();        t2.start();    }}

运行上述代码,你会发现每次存款操作都是原子性的,最终余额一定是 1500(5×100 + 5×200),不会出现混乱结果。这正是 多线程同步 的作用。

同步方法 vs 同步代码块

除了同步整个方法,你也可以只同步方法中的关键部分,使用同步代码块:

public void deposit(double amount) {    synchronized(this) {        balance += amount;        // 其他关键操作    }}

同步代码块更灵活,可以减少锁的粒度,提高程序并发性能。但对于初学者,使用 synchronized关键字 修饰整个方法更简单、不易出错。

注意事项

  • 同步方法会降低程序并发性能,因为同一时间只有一个线程能执行。
  • 不要在同步方法中调用耗时操作(如网络请求、文件读写),以免阻塞其他线程。
  • 静态同步方法和非静态同步方法使用的锁不同,不会互相阻塞。

总结

通过本教程,你已经掌握了 Java同步方法 的基本概念和使用方式。记住,synchronized 是保证 Java线程安全 的重要工具,尤其在处理共享资源时必不可少。合理使用 多线程同步 技术,可以让你的程序在并发环境下稳定运行。

继续练习吧!尝试自己编写一个多线程售票系统,使用同步方法防止超卖问题,巩固今天所学的 synchronized关键字 知识。