java 变量如何上锁

变量上锁的基本方法
在Java中,变量上锁通常通过synchronized关键字或java.util.concurrent.locks包中的锁机制实现。直接对变量上锁需通过锁住访问该变量的代码块或方法。

使用synchronized关键字
private Object lock = new Object(); // 锁对象
private int sharedVariable = 0;
public void updateVariable() {
synchronized (lock) { // 锁定代码块
sharedVariable++;
}
}
- 锁对象可以是任意对象,但需保证所有线程使用同一个锁对象。
- 同步方法则直接修饰方法:
public synchronized void method() { ... }。
使用ReentrantLock
import java.util.concurrent.locks.ReentrantLock;
private final ReentrantLock lock = new ReentrantLock();
private int sharedVariable = 0;
public void updateVariable() {
lock.lock(); // 显式加锁
try {
sharedVariable++;
} finally {
lock.unlock(); // 确保释放锁
}
}
ReentrantLock提供更灵活的锁控制,如可中断、超时尝试获取锁等。
针对特定变量类型的锁策略
基本类型与对象引用
- 基本类型(如
int)需通过锁对象或锁代码块保护。 - 对象引用可通过锁住对象本身或使用其内部锁:
private String sharedString = "data";
public void updateString() { synchronized (sharedString) { // 使用对象内部锁 sharedString = sharedString.concat("new"); } }
注意:锁对象引用时,需确保引用指向的对象不变(如`final`修饰),否则可能失效。
#### 原子变量(无锁方案)
对基本类型变量,`java.util.concurrent.atomic`包提供原子类实现无锁线程安全:
```java
private AtomicInteger atomicVariable = new AtomicInteger(0);
public void increment() {
atomicVariable.incrementAndGet(); // 原子操作
}
- 适用于计数器等场景,性能通常优于锁机制。
锁的注意事项
- 避免死锁:确保锁的获取和释放成对出现,且顺序一致。
- 粒度控制:锁范围过大可能降低性能,过小可能导致线程安全问题。
- volatile 关键字:仅保证可见性,不保证原子性。适合单线程写、多线程读的场景:
private volatile boolean flag = false; // 可见性保障
通过合理选择锁机制或原子类,可高效实现变量线程安全访问。






