在Java編程中,鎖和事務是兩個常見的概念。它們的作用不同,但都可以用來處理多線程并發的問題。
鎖是一種同步機制,可以讓每次只有一個線程訪問共享資源。常見的鎖包括synchronized關鍵字、ReentrantLock和ReadWriteLock等。這些鎖都可以保證在同一時間內只有一個線程可以執行關鍵代碼段,從而避免了并發問題。
public class LockDemo { private static int counter = 0; private static final Object lock = new Object(); public static void main(String[] args) { for (int i = 0; i < 100; i++) { new Thread(() -> { synchronized (lock) { for (int j = 0; j < 1000; j++) { counter++; } } }).start(); } } }
事務則是一種原子操作,可以將幾個操作看成一個整體進行處理。當事務操作完成后,要么所有操作都成功,要么所有操作都失敗,從而保證了數據的完整性和一致性。
public class TransactionDemo { public static void main(String[] args) throws SQLException { Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password"); conn.setAutoCommit(false); try { PreparedStatement stmt1 = conn.prepareStatement("UPDATE users SET balance = balance - 100 WHERE id = ?"); stmt1.setInt(1, 1); stmt1.executeUpdate(); PreparedStatement stmt2 = conn.prepareStatement("UPDATE users SET balance = balance + 100 WHERE id = ?"); stmt2.setInt(1, 2); stmt2.executeUpdate(); conn.commit(); } catch (SQLException e) { conn.rollback(); } finally { conn.close(); } } }
總體來說,鎖和事務都可以用來處理多線程并發的問題,但是它們的作用和用法各有不同。鎖用來控制并發訪問,事務用來保證數據操作的原子性、一致性和持久性。