java如何同步
Java同步的基本方法
在Java中,同步用于控制多线程对共享资源的访问,防止数据不一致问题。以下是几种常见的同步方法:
使用synchronized关键字
synchronized可以修饰方法或代码块,确保同一时间只有一个线程能执行该段代码。修饰实例方法时,锁是当前实例对象;修饰静态方法时,锁是类的Class对象。
public synchronized void syncMethod() {
// 同步方法
}
public void syncBlock() {
synchronized(this) {
// 同步代码块
}
}
使用ReentrantLock
ReentrantLock是java.util.concurrent.locks包下的显式锁,提供比synchronized更灵活的锁机制,支持公平锁、可中断锁等特性。
private final ReentrantLock lock = new ReentrantLock();
public void lockExample() {
lock.lock();
try {
// 临界区代码
} finally {
lock.unlock();
}
}
使用volatile关键字
volatile确保变量的可见性,但不保证原子性。适用于单个变量的简单同步场景。
private volatile boolean flag = false;
高级同步工具
CountDownLatch
允许一个或多个线程等待其他线程完成操作。
CountDownLatch latch = new CountDownLatch(3);
// 线程中调用latch.countDown()
latch.await(); // 等待计数归零
CyclicBarrier
让一组线程互相等待,到达屏障点后继续执行。
CyclicBarrier barrier = new CyclicBarrier(3);
barrier.await(); // 线程会在此等待
Semaphore
控制同时访问资源的线程数量。
Semaphore semaphore = new Semaphore(5);
semaphore.acquire(); // 获取许可
semaphore.release(); // 释放许可
线程安全集合
Java提供了一系列线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等,适用于高并发场景。
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1);
注意事项
- 避免死锁:确保锁的获取和释放顺序一致。
- 减少锁粒度:尽量缩小同步代码块的范围。
- 考虑性能:无竞争的同步会带来额外开销,高并发场景可考虑无锁编程(如CAS)。
选择同步方式时需根据具体场景权衡性能、复杂度和功能需求。







