锁机制在并发编程和数据库管理中用于控制对资源的访问,确保数据一致性和系统稳定性。以下是各种锁的解释及其应用场景:
SELECT ... FOR UPDATE
语句可以实现悲观锁。ReentrantReadWriteLock
。SELECT ... FOR UPDATE
语句可以锁定单行记录。LOCK TABLES
语句可以锁定表。Atomic
包中的CAS操作(Compare-And-Swap)。SELECT ... FOR UPDATE
。setnx
命令。synchronized
关键字和ReentrantLock
。ReentrantLock
构造函数可以设置为公平锁。synchronized
和默认的ReentrantLock
。以下是各类锁在Java中的简单示例代码:
sql复制代码-- 悲观锁示例
BEGIN;
SELECT * FROM products WHERE product_id = 1 FOR UPDATE;
-- 进行相关操作...
COMMIT;
java复制代码public boolean updateProduct(Product product) {
String sql = "UPDATE products SET stock = ?, version = ? WHERE product_id = ? AND version = ?";
int result = jdbcTemplate.update(sql, product.getStock(), product.getVersion() + 1, product.getProductId(), product.getVersion());
return result == 1;
}
java复制代码ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
Lock readLock = readWriteLock.readLock();
Lock writeLock = readWriteLock.writeLock();
public void readData() {
readLock.lock();
try {
// 读取数据
} finally {
readLock.unlock();
}
}
public void writeData() {
writeLock.lock();
try {
// 写入数据
} finally {
writeLock.unlock();
}
}
java复制代码public class SpinLock {
private AtomicReference<Thread> owner = new AtomicReference<>();
public void lock() {
Thread currentThread = Thread.currentThread();
while (!owner.compareAndSet(null, currentThread)) {
// 自旋
}
}
public void unlock() {
Thread currentThread = Thread.currentThread();
owner.compareAndSet(currentThread, null);
}
}
java复制代码public boolean acquireLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
String result = jedis.set(lockKey, requestId, "NX", "PX", expireTime);
return "OK".equals(result);
}
public boolean releaseLock(Jedis jedis, String lockKey, String requestId) {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
"return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
return "1".equals(result);
}
java复制代码public synchronized void synchronizedMethod() {
// 同步代码块
}
public void reentrantLockMethod() {
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
// 同步代码块
} finally {
lock.unlock();
}
}
java复制代码ReentrantLock fairLock = new ReentrantLock(true); // 公平锁
ReentrantLock nonFairLock = new ReentrantLock(); // 非公平锁,默认
public void fairLockMethod() {
fairLock.lock();
try {
// 同步代码块
} finally {
fairLock.unlock();
}
}
锁机制在并发编程和数据库管理中扮演着重要角色,选择合适的锁机制可以有效提升系统的并发性能和数据一致性。根据具体应用场景的需求,合理选择和组合锁机制,才能实现高效稳定的系统。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。