有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准
https://blog.zysicyj.top
在Java中,有几种方式可以实现对某个变量的锁定:
synchronized void synchronizedMethod() {
// 代码块被锁定,只能被一个线程执行
// ...
}
void someMethod() {
synchronized (this) {
// 代码块被锁定,只能被一个线程执行
// ...
}
}
import java.util.concurrent.locks.ReentrantLock;
ReentrantLock lock = new ReentrantLock();
void someMethod() {
lock.lock(); // 锁定变量
try {
// 代码块被锁定,只能被一个线程执行
// ...
} finally {
lock.unlock(); // 释放锁
}
}
import java.util.concurrent.atomic.AtomicInteger;
AtomicInteger counter = new AtomicInteger();
void increment() {
counter.incrementAndGet(); // 原子性地增加变量的值
}
volatile boolean flag = false;
void someMethod() {
flag = true; // 对volatile变量的写操作
}
void anotherMethod() {
if (flag) {
// 对volatile变量的读操作
// ...
}
}
使用Lock接口的实现类:除了ReentrantLock,Java还提供了其他实现了Lock接口的类,如ReadWriteLock、StampedLock等。这些类提供了更多的锁定机制和功能,例如读写锁、乐观锁等。根据具体的需求,可以选择合适的Lock实现类来实现对变量的锁定。
使用synchronized关键字的Lock对象:除了使用synchronized关键字锁定方法或代码块外,还可以使用synchronized关键字锁定一个特定的对象,即使用synchronized关键字的Lock对象。这种方式可以更细粒度地控制对变量的锁定。例如:
Object lock = new Object();
void someMethod() {
synchronized (lock) {
// 代码块被锁定,只能被一个线程执行
// ...
}
}
除了前面提到的方式,还有其他一些方式可以在Java中对变量进行锁定:
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
ReadWriteLock lock = new ReentrantReadWriteLock();
// ...
void readMethod() {
lock.readLock().lock(); // 获取读锁
try {
// 读取共享变量
// ...
} finally {
lock.readLock().unlock(); // 释放读锁
}
}
void writeMethod() {
lock.writeLock().lock(); // 获取写锁
try {
// 修改共享变量
// ...
} finally {
lock.writeLock().unlock(); // 释放写锁
}
}
import java.util.concurrent.Semaphore;
Semaphore semaphore = new Semaphore(1); // 设置许可数量为1
void someMethod() {
try {
semaphore.acquire(); // 获取许可
// 访问共享变量
// ...
} catch (InterruptedException e) {
// 处理中断异常
} finally {
semaphore.release(); // 释放许可
}
}
除了前面提到的方式,还有一些其他的方式可以在Java中对变量进行锁定:
import java.util.concurrent.locks.StampedLock;
StampedLock lock = new StampedLock();
// ...
void readMethod() {
long stamp = lock.tryOptimisticRead(); // 尝试获取乐观读锁
// 读取共享变量
// ...
if (!lock.validate(stamp)) {
// 乐观读锁无效,需要升级为悲观读锁
stamp = lock.readLock(); // 获取悲观读锁
try {
// 读取共享变量
// ...
} finally {
lock.unlockRead(stamp); // 释放悲观读锁
}
}
}
void writeMethod() {
long stamp = lock.writeLock(); // 获取写锁
try {
// 修改共享变量
// ...
} finally {
lock.unlockWrite(stamp); // 释放写锁
}
}
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();
// ...
void awaitMethod() throws InterruptedException {
lock.lock();
try {
condition.await(); // 在条件下等待
} finally {
lock.unlock();
}
}
void signalMethod() {
lock.lock();
try {
condition.signal(); // 唤醒等待的线程
} finally {
lock.unlock();
}
}
扫码长按关注交流群获取最新消息,免费的面试题手册即将在交流群内推出
公众号
个人微信
本文由 mdnice 多平台发布