java如何同步
同步的基本概念
在Java中,同步用于控制多线程对共享资源的访问,避免数据不一致和线程安全问题。常见的同步机制包括synchronized关键字、ReentrantLock、volatile变量以及并发工具类。
使用synchronized关键字
synchronized可以修饰方法或代码块,确保同一时间只有一个线程执行被保护的代码。
修饰实例方法:
public synchronized void method() {
// 线程安全代码
}
修饰静态方法:
public static synchronized void staticMethod() {
// 线程安全代码
}
同步代码块:
public void blockMethod() {
synchronized(this) {
// 线程安全代码
}
}
使用ReentrantLock
ReentrantLock提供了更灵活的锁机制,支持公平锁、可中断锁和超时锁。
private final ReentrantLock lock = new ReentrantLock();
public void lockMethod() {
lock.lock();
try {
// 线程安全代码
} finally {
lock.unlock();
}
}
使用volatile变量
volatile确保变量的可见性,但不保证原子性。适用于简单的状态标志。
private volatile boolean flag = false;
并发工具类
Java提供了java.util.concurrent包,包含多种线程安全的集合和工具类。
ConcurrentHashMap示例:
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1);
CountDownLatch示例:
CountDownLatch latch = new CountDownLatch(3);
latch.await(); // 等待计数器归零
latch.countDown(); // 计数器减1
原子类
java.util.concurrent.atomic包提供了原子变量类,如AtomicInteger。
private AtomicInteger counter = new AtomicInteger(0);
public void increment() {
counter.incrementAndGet();
}
线程安全的单例模式
双重检查锁定实现线程安全的单例:

public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
注意事项
- 避免过度同步,否则可能导致性能下降。
- 优先使用并发工具类而非手动实现同步。
- 注意死锁问题,确保锁的获取和释放顺序一致。






