那全局变量的set操作如何加锁
时间: 2024-04-08 19:29:32 浏览: 102
要对全局变量的 set 操作进行加锁,可以使用对象级别的锁或者使用 `Atomic` 类。
1. 对象级别的锁:可以使用对象的 `synchronized` 方法或代码块来实现对全局变量 set 操作的加锁。例如:
```java
public class GlobalVariableExample {
private static int globalVariable = 0;
public static void main(String[] args) {
// 创建多个线程并启动
for (int i = 0; i < 5; i++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
setGlobalVariable(10);
}
});
thread.start();
}
}
public static synchronized void setGlobalVariable(int value) {
// 加锁了的代码块
globalVariable = value;
System.out.println("Global variable value set to: " + globalVariable);
}
}
```
在上面的示例中,`setGlobalVariable()` 方法被声明为 `synchronized`,这意味着在同一时间只有一个线程可以执行该方法。因此,当多个线程尝试同时调用 `setGlobalVariable()` 方法时,只有一个线程能够成功执行,确保全局变量的 set 操作是安全的。
2. 使用 `Atomic` 类:`Atomic` 类提供了一组原子操作,可以保证对变量的操作是原子性的,不需要显式的加锁。例如,可以使用 `AtomicInteger` 来代替普通的 `int` 类型全局变量。
```java
import java.util.concurrent.atomic.AtomicInteger;
public class GlobalVariableExample {
private static AtomicInteger globalVariable = new AtomicInteger(0);
public static void main(String[] args) {
// 创建多个线程并启动
for (int i = 0; i < 5; i++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
setGlobalVariable(10);
}
});
thread.start();
}
}
public static void setGlobalVariable(int value) {
globalVariable.set(value);
System.out.println("Global variable value set to: " + globalVariable.get());
}
}
```
在上面的示例中,使用了 `AtomicInteger` 来代替 `int` 类型的全局变量 `globalVariable`。`AtomicInteger` 提供了原子操作,确保对变量的 set 操作是原子性的,不需要显式的加锁。
这两种方法都可以实现对全局变量 set 操作的加锁,具体使用哪种方法取决于你的需求和场景。
阅读全文