java 如何实现线程安全
线程安全的基本概念
线程安全指多线程环境下,程序能正确处理共享资源,避免数据竞争和不一致。Java中实现线程安全的方法多样,需根据场景选择合适方案。
使用synchronized关键字
synchronized可修饰方法或代码块,确保同一时间仅一个线程访问共享资源。
// 同步方法
public synchronized void increment() {
count++;
}
// 同步代码块
public void increment() {
synchronized(this) {
count++;
}
}
使用volatile关键字
volatile保证变量的可见性,避免线程缓存旧值,但不保证原子性。适用于单写多读场景。

private volatile boolean flag = false;
使用java.util.concurrent包中的原子类
原子类(如AtomicInteger)通过CAS(Compare-And-Swap)实现无锁线程安全操作。
private AtomicInteger counter = new AtomicInteger(0);
public void increment() {
counter.incrementAndGet();
}
使用锁机制(ReentrantLock)
ReentrantLock提供更灵活的锁控制,支持公平锁、可中断锁等特性。

private final ReentrantLock lock = new ReentrantLock();
public void update() {
lock.lock();
try {
// 临界区代码
} finally {
lock.unlock();
}
}
使用线程安全集合
Java提供ConcurrentHashMap、CopyOnWriteArrayList等线程安全集合类。
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1);
不可变对象
通过设计不可变类(如String)避免线程同步问题。所有字段设为final,不暴露修改方法。
public final class ImmutableValue {
private final int value;
public ImmutableValue(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
使用ThreadLocal
ThreadLocal为每个线程创建独立的变量副本,避免共享资源竞争。
private ThreadLocal<Integer> threadLocalCount = ThreadLocal.withInitial(() -> 0);
public void increment() {
threadLocalCount.set(threadLocalCount.get() + 1);
}
选择合适的线程安全策略
- 高并发读:优先使用
CopyOnWrite集合或不可变对象。 - 高并发写:考虑
ConcurrentHashMap分段锁或ReentrantLock。 - 简单计数器:原子类性能优于
synchronized。






