推荐答案
在Java中,锁主要分为以下几种:
- 内置锁(Synchronized):通过
synchronized关键字实现,可以用于方法或代码块。 - 显式锁(ReentrantLock):
java.util.concurrent.locks.ReentrantLock类提供的锁,提供了比synchronized更灵活的锁机制。 - 读写锁(ReentrantReadWriteLock):
java.util.concurrent.locks.ReentrantReadWriteLock类提供的锁,允许多个读线程同时访问,但写线程独占锁。 - StampedLock:
java.util.concurrent.locks.StampedLock类提供的锁,提供了乐观读锁、悲观读锁和写锁三种模式。 - 条件锁(Condition):
java.util.concurrent.locks.Condition接口提供的锁,通常与ReentrantLock配合使用,用于线程间的协调。 - 分布式锁:通过第三方工具(如Redis、Zookeeper等)实现的锁,用于分布式系统中的并发控制。
本题详细解读
1. 内置锁(Synchronized)
内置锁是Java中最基本的锁机制,通过synchronized关键字实现。它可以用于方法或代码块,确保同一时间只有一个线程可以执行被锁定的代码。
// www.javascriptcn.com code example
public synchronized void method() {
// 线程安全的代码
}
public void method() {
synchronized (this) {
// 线程安全的代码
}
}2. 显式锁(ReentrantLock)
ReentrantLock是java.util.concurrent.locks包中的一个类,提供了比synchronized更灵活的锁机制。它支持公平锁和非公平锁,并且可以中断等待锁的线程。
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
// 线程安全的代码
} finally {
lock.unlock();
}3. 读写锁(ReentrantReadWriteLock)
ReentrantReadWriteLock允许多个读线程同时访问,但写线程独占锁。这种锁适用于读多写少的场景,可以提高并发性能。
// www.javascriptcn.com code example
ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
rwLock.readLock().lock();
try {
// 读操作
} finally {
rwLock.readLock().unlock();
}
rwLock.writeLock().lock();
try {
// 写操作
} finally {
rwLock.writeLock().unlock();
}4. StampedLock
StampedLock是Java 8引入的一种新的锁机制,提供了乐观读锁、悲观读锁和写锁三种模式。乐观读锁在读操作较多的情况下可以提高性能。
// www.javascriptcn.com code example
StampedLock stampedLock = new StampedLock();
long stamp = stampedLock.tryOptimisticRead();
// 读操作
if (!stampedLock.validate(stamp)) {
stamp = stampedLock.readLock();
try {
// 读操作
} finally {
stampedLock.unlockRead(stamp);
}
}
long writeStamp = stampedLock.writeLock();
try {
// 写操作
} finally {
stampedLock.unlockWrite(writeStamp);
}5. 条件锁(Condition)
Condition接口通常与ReentrantLock配合使用,用于线程间的协调。它提供了await()、signal()和signalAll()等方法,类似于Object的wait()、notify()和notifyAll()。
// www.javascriptcn.com code example
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();
lock.lock();
try {
while (/* 条件不满足 */) {
condition.await();
}
// 执行操作
} finally {
lock.unlock();
}6. 分布式锁
分布式锁用于分布式系统中的并发控制,通常通过第三方工具(如Redis、Zookeeper等)实现。分布式锁可以确保在分布式环境中同一时间只有一个节点可以执行某个操作。
// www.javascriptcn.com code example
// 使用Redis实现分布式锁
Jedis jedis = new Jedis("localhost");
String lockKey = "lock_key";
String requestId = UUID.randomUUID().toString();
int expireTime = 30000; // 30秒
// 尝试获取锁
String result = jedis.set(lockKey, requestId, "NX", "PX", expireTime);
if ("OK".equals(result)) {
try {
// 执行操作
} finally {
// 释放锁
if (requestId.equals(jedis.get(lockKey))) {
jedis.del(lockKey);
}
}
}