Java 中的锁主要有以下几种:
synchronized:synchronized 是 Java 中最基本的锁,它是一种悲观锁,也称为互斥锁。synchronized 可以用来修饰方法或代码块,使用 synchronized 修饰的方法或代码块在同一时刻只能被一个线程执行。synchronized 的使用方式如下:
public synchronized void method() {
// synchronized 修饰的方法体
}
public void method2() {
synchronized (this) {
// synchronized 修饰的代码块
}
}
ReentrantLock:ReentrantLock 是 Java 中的一种可重入锁,它也是一种悲观锁,可以替代 synchronized 实现线程同步。ReentrantLock 的使用方式如下:
ReentrantLock lock = new ReentrantLock();
lock.lock(); // 获取锁
try {
// 执行同步代码块
} finally {
lock.unlock(); // 释放锁
}
ReadWriteLock:ReadWriteLock 是一种读写锁,它允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。ReadWriteLock 的使用方式如下:
ReadWriteLock lock = new ReentrantReadWriteLock();
lock.readLock().lock(); // 获取读锁
try {
// 执行读操作
} finally {
lock.readLock().unlock(); // 释放读锁
}
lock.writeLock().lock(); // 获取写锁
try {
// 执行写操作
} finally {
lock.writeLock().unlock(); // 释放写锁
}
StampedLock:StampedLock 是 Java 8 新增的一种锁机制,它是一种乐观锁,可以实现比 ReentrantLock 更高效的读写锁。StampedLock 的使用方式如下:
StampedLock lock = new StampedLock();
long stamp = lock.readLock(); // 获取读锁
try {
// 执行读操作
} finally {
lock.unlockRead(stamp); // 释放读锁
}
long stamp2 = lock.writeLock(); // 获取写锁
try {
// 执行写操作
} finally {
lock.unlockWrite(stamp2); // 释放写锁
}
以上是 Java 中主要的几种锁,使用时需要根据具体情况选择合适的锁机制。