ThreadLocal 修饰变量代码
时间: 2023-07-17 10:10:01 浏览: 96
Java中的线程同步与ThreadLocal无锁化线程封闭实现
当使用ThreadLocal修饰变量时,可以按照以下代码示例进行操作:
```java
public class ThreadLocalExample {
private static ThreadLocal<Integer> counter = new ThreadLocal<>();
public static void main(String[] args) {
// 在主线程设置counter的值
counter.set(0);
// 创建两个线程并启动
Thread thread1 = new Thread(new MyRunnable());
Thread thread2 = new Thread(new MyRunnable());
thread1.start();
thread2.start();
try {
// 等待两个线程执行完毕
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 打印结果
System.out.println("Final counter value: " + counter.get());
}
static class MyRunnable implements Runnable {
@Override
public void run() {
// 获取当前线程的计数器值
int value = counter.get();
// 对计数器进行加1操作
value++;
// 重新设置计数器值
counter.set(value);
System.out.println("Thread " + Thread.currentThread().getId() + " counter value: " + counter.get());
}
}
}
```
在上述示例中,我们创建了一个ThreadLocal对象 `counter` 来存储计数器。在主线程中,我们通过 `counter.set(0)` 将初始值设为0。然后,我们创建两个线程,并在每个线程的 `run()` 方法中通过 `counter.get()` 获取当前线程的计数器值,并对其进行加1操作,最后通过 `counter.set(value)` 重新设置计数器值。
在每个线程的 `run()` 方法中,我们通过 `counter.get()` 获取当前线程的计数器值,并通过 `counter.set(value)` 设置新的计数器值。这样,每个线程都有独立的计数器副本,互不干扰。
最后,在主线程中,我们通过 `counter.get()` 获取最终的计数器值,并打印出来。
运行示例代码,你会看到类似以下的输出结果:
```
Thread 11 counter value: 1
Thread 12 counter value: 1
Final counter value: 0
```
可以看到,每个线程都有独立的计数器值,并且最终主线程获取到的计数器值为初始值0,没有被其他线程修改。这就是使用ThreadLocal修饰变量来实现线程间隔离的效果。
阅读全文