博客主页: 南来_北往
系列专栏:Spring Boot实战
Java中锁的实现方式主要有以下几种:
1、synchronized关键字:这是Java中最基本的同步机制,通过在方法或代码块前加上synchronized关键字,可以使得同一时刻只有一个线程能够访问被synchronized修饰的代码块。synchronized关键字可以修饰方法和代码块。
public synchronized void method() {
// 同步代码块
}
public void method() {
synchronized (this) {
// 同步代码块
}
}
2、ReentrantLock:ReentrantLock是一个可重入的互斥锁,它提供了与synchronized相同的基本行为和语义,但是比synchronized更加灵活。ReentrantLock允许尝试获取锁、定时获取锁以及中断等待锁的线程等高级功能。
import java.util.concurrent.locks.ReentrantLock;
public class LockExample {
private final ReentrantLock lock = new ReentrantLock();
public void method() {
lock.lock(); // 获取锁
try {
// 临界区代码
} finally {
lock.unlock(); // 释放锁
}
}
}
3、ReadWriteLock:ReadWriteLock是一个读写锁接口,它维护了一对关联的锁,一个用于只读操作,另一个用于写入操作。当多个线程只读取共享资源时,它们可以同时获得读锁;当有一个线程需要写入共享资源时,它会阻塞其他所有线程(无论是读还是写)。
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLockExample {
private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
public void read() {
readWriteLock.readLock().lock(); // 获取读锁
try {
// 读取共享资源
} finally {
readWriteLock.readLock().unlock(); // 释放读锁
}
}
public void write() {
readWriteLock.writeLock().lock(); // 获取写锁
try {
// 写入共享资源
} finally {
readWriteLock.writeLock().unlock(); // 释放写锁
}
}
}
4、StampedLock:StampedLock是Java 8引入的一种新的锁机制,它提供了一种乐观读锁的机制,可以在没有写操作的情况下提高并发性能。StampedLock支持三种模式:写锁、悲观读锁和乐观读锁。
import java.util.concurrent.locks.StampedLock;
public class StampedLockExample {
private final StampedLock stampedLock = new StampedLock();
public void read() {
long stamp = stampedLock.tryOptimisticRead(); // 尝试获取乐观读锁
// 读取共享资源
if (!stampedLock.validate(stamp)) { // 验证是否成功
stamp = stampedLock.readLock(); // 获取悲观读锁
try {
// 重新读取共享资源
} finally {
stampedLock.unlockRead(stamp); // 释放悲观读锁
}
}
}
public void write() {
long stamp = stampedLock.writeLock(); // 获取写锁
try {
// 写入共享资源
} finally {
stampedLock.unlockWrite(stamp); // 释放写锁
}
}
}