写一段java代码,通过锁表的一条记录解决并发问题
时间: 2024-03-17 07:47:05 浏览: 55
假设有一个表名为 `user`,其中包含 `id` 和 `balance` 两个字段,现在需要通过 `id` 获取用户的 `balance`,并且在获取的同时对该记录进行加锁,防止其他并发请求修改该记录,可以使用如下 Java 代码:
```java
public class UserService {
private final Object lock = new Object();
public int getUserBalance(int userId) {
synchronized (lock) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = getConnection();
stmt = conn.prepareStatement("SELECT balance FROM user WHERE id = ? FOR UPDATE");
stmt.setInt(1, userId);
rs = stmt.executeQuery();
if (rs.next()) {
return rs.getInt("balance");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(rs);
close(stmt);
close(conn);
}
return 0;
}
}
}
```
在该代码中,使用了一个私有的 `lock` 对象作为锁,通过 `synchronized` 关键字对该对象进行加锁,保证了同一时间只有一个线程能够执行该方法。在 SQL 语句中使用了 `FOR UPDATE`,表示对查询结果进行加锁,防止其他并发请求修改该记录。
阅读全文