synchronized通过加锁实现线程同步,修饰实例方法时锁当前对象(this),修饰静态方法时锁类Class对象,使用代码块可指定更细粒度的锁对象,推荐私有final对象以确保唯一性,避免使用String常量或null,合理控制同步范围以平衡线程安全与性能。

在Java中,synchronized关键字用于控制多个线程对共享资源的访问,保证同一时刻只有一个线程可以执行某个代码块或方法,从而防止线程安全问题。它主要通过加锁机制实现,适用于多线程环境下的同步操作。
当synchronized修饰一个实例方法时,锁对象是当前类的实例(即this)。多个线程访问同一个对象的该方法时,会互斥执行。
示例:
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public int getCount() {
return count;
}
}
在这个例子中,多个线程调用同一个Counter对象的increment()方法时,会同步执行,避免了竞态条件。
静态方法属于类而不是实例,因此synchronized修饰静态方法时,锁的是该类的Class对象(如Counter.class)。所有该类的实例共享这一把锁。
立即学习“Java免费学习笔记(深入)”;
示例:
public class Counter {
private static int total = 0;
public static synchronized void addTotal() {
total++;
}
}
不同实例调用addTotal()方法时也会被同步,因为它们竞争的是同一个类级别的锁。
有时不需要对整个方法加锁,可以使用synchronized代码块来锁定更小范围的代码,提高并发性能。需要指定一个锁对象。
示例:
public class Counter {
private int count = 0;
private final Object lock = new Object();
public void increment() {
synchronized(lock) {
count++;
}
}
}
这种方式更加灵活,可以选择任意对象作为锁,推荐使用私有final对象作为锁,避免外部干扰。
使用synchronized时,锁的对象必须是唯一的,才能起到同步作用。
基本上就这些。合理使用synchronized能有效解决线程安全问题,但要注意粒度控制,避免过度同步影响性能。
以上就是Java中synchronized关键字使用方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号