多台服务器但是一般是用一个数据库的数据源,通过数据库的行锁或事务实现进程间的互斥。
示例代码(MySQL行锁)
public class DatabaseLockExample {
private static final String DB_URL = "jdbc:mysql://localhost:3306/mydb";
private static final String USER = "root";
private static final String PASS = "password";
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS)) {
// 开启事务并锁定某一行
conn.setAutoCommit(false);
PreparedStatement stmt = conn.prepareStatement(
"SELECT * FROM locks WHERE lock_name = 'my_lock' FOR UPDATE"
);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
System.out.println("进程获取到数据库锁,开始执行临界区操作...");
Thread.sleep(5000); // 模拟耗时操作
}
conn.commit(); // 提交事务后释放锁
} catch (Exception e) {
e.printStackTrace();
}
}
}
优点:适用于分布式环境。
缺点:依赖数据库,需处理连接池和事务超时。