java如何同步事物
Java 事务同步方法
使用 synchronized 关键字
synchronized 是 Java 中最基础的同步机制,可以修饰方法或代码块,确保同一时间只有一个线程访问共享资源。
public synchronized void synchronizedMethod() {
// 线程安全代码
}
public void someMethod() {
synchronized (this) {
// 线程安全代码块
}
}
使用 ReentrantLock
ReentrantLock 提供了比 synchronized 更灵活的锁机制,支持公平锁、可中断锁和超时锁。
private final ReentrantLock lock = new ReentrantLock();
public void performTask() {
lock.lock();
try {
// 线程安全代码
} finally {
lock.unlock();
}
}
使用 volatile 关键字
volatile 确保变量的可见性,但不保证原子性,适用于单一变量的简单同步场景。
private volatile boolean flag = false;
使用原子类(AtomicInteger 等)
Java 提供了一系列原子类(如 AtomicInteger、AtomicReference),通过 CAS(Compare-And-Swap)实现无锁线程安全操作。

private AtomicInteger counter = new AtomicInteger(0);
public void increment() {
counter.incrementAndGet();
}
使用 ThreadLocal
ThreadLocal 为每个线程提供独立的变量副本,避免共享变量引发的线程安全问题。
private ThreadLocal<Integer> threadLocalCounter = ThreadLocal.withInitial(() -> 0);
public void increment() {
threadLocalCounter.set(threadLocalCounter.get() + 1);
}
使用并发集合
Java 并发包(java.util.concurrent)提供了线程安全的集合类,如 ConcurrentHashMap、CopyOnWriteArrayList 等。
private ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
数据库事务同步
在涉及数据库操作时,可以通过 JDBC 或框架(如 Spring)管理事务。

JDBC 事务示例:
Connection conn = DriverManager.getConnection(url, user, password);
try {
conn.setAutoCommit(false);
// 执行 SQL 操作
conn.commit();
} catch (SQLException e) {
conn.rollback();
} finally {
conn.setAutoCommit(true);
conn.close();
}
Spring 事务管理:
通过 @Transactional 注解声明事务边界。
@Transactional
public void performDatabaseOperation() {
// 数据库操作
}
分布式事务同步
在分布式系统中,可使用框架如 Seata 或 Spring Cloud 的分布式事务解决方案。
@GlobalTransactional
public void distributedTransaction() {
// 跨服务调用
}
选择同步方法的依据
- 简单同步:
synchronized或volatile。 - 复杂锁需求:
ReentrantLock。 - 高性能无锁操作:原子类。
- 线程隔离:
ThreadLocal。 - 数据库事务:JDBC 或 Spring 事务管理。
- 分布式系统:Seata 或 Spring Cloud 解决方案。






