• 常用
  • 百度
  • google
  • 站内搜索

科技

Java中如何使用synchronized关键字

  • 更新日期:2025-11-30
  • 查看次数:3254

synchronized用于确保线程安全,其锁对象依修饰目标而定:实例方法锁this,静态方法锁Class对象,代码块可自定义锁;需注意锁粒度、避免死锁,并优先考虑并发工具类替代。

如何在Java中使用synchronized关键字

在Java中,synchronized关键字用于控制多个线程对共享资源的访问,确保同一时刻只有一个线程可以执行某个代码块或方法,从而防止数据竞争和保证线程安全。下面介绍它的几种常见用法和注意事项。

1. synchronized修饰实例方法

当synchronized修饰一个实例方法时,锁对象是当前实例(this)。这意味着同一对象的多个同步方法在同一时间只能被一个线程访问。

示例:

public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

在这个例子中,increment() 和 getCount() 方法都使用 this 作为锁。如果两个线程同时调用同一个Counter实例的increment()方法,只有一个线程能进入,另一个会被阻塞直到第一个线程退出方法。

2. synchronized修饰静态方法

当synchronized修饰静态方法时,锁的是该类的Class对象(例如 Counter.class),而不是实例对象。这适用于保护类级别的共享资源。

示例:

public class StaticCounter {
    private static int total = 0;

    public static synchronized void addToTotal() {
        total++;
    }
}

此时,无论创建多少个StaticCounter实例,所有线程调用addToTotal()都会在Class对象上同步,确保静态变量total的安全访问。

3. synchronized代码块

有时你不需要同步整个方法,而只想同步部分代码。这时可以使用synchronized代码块,它允许你指定具体的锁对象,灵活性更高。

示例:

public class Task {
    private Object lock = new Object();

    public void doSomething() {
        // 非同步代码
        System.out.println("准备开始");

        synchronized (lock) {
            // 同步代码块
            System.out.println("正在执行同步操作");
            // 模拟耗时操作
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }

        // 非同步代码
        System.out.println("完成");
    }
}

这里使用一个独立的Object作为锁,避免影响其他无关的同步操作。也可以使用this作为锁对象,但要根据实际场景选择合适的锁粒度。

4. 注意事项与最佳实践

synchronized虽然简单有效,但也有一些需要注意的地方:
  • 锁的对象不能为null,否则会抛出NullPointerException
  • 尽量减小同步范围,避免长时间持有锁导致性能下降
  • 避免死锁:多个线程以不同顺序获取多个锁时可能造成死锁
  • 不要用String常量或public对象作为锁,因为它们可能被外部访问或复用
  • 考虑使用java.util.concurrent包中的更高级工具(如ReentrantLock、Atomic类)来替代synchronized,在复杂场景下更灵活

基本上就这些。synchronized是Java中最基础的线程同步机制,理解其作用范围和锁对象是正确使用的关键。不复杂但容易忽略细节。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

imtoken下载 im钱包 imtoken imtoken 快连官网 imtoken imtoken imtoken imtoken imtoken wallet imtoken imtoken官网 imtoken钱包 imtoken下载 imtoken官网 imtoken钱包 imtoken安卓下载 imtoken下载 imtoken官方下载 imtoken官网 imtoken安卓下载 imtoken下载 imtoken下载 imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken bitget wallet telegram下载 quickq VPN trust wallet v2rayn imtoken