原子对象的单个方法具有原子性,通过 CAS 算法和自旋操作实现,并发效率高。使用时需导入 import java.util.concurrent.atomic.*
。
public class ThreadDemo {
public static void main(String[] args) {
MyThread t = new MyThread();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
t2.start();
}
}
class MyThread implements Runnable {
AtomicInteger count = new AtomicInteger(0); // 定义整型地原子类
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
count.incrementAndGet(); // 原子性自增操作
}
System.out.println("final x: " + count); // 最后输出的数据为 20000
}
}Copy to clipboardErrorCopied
ThreadLocal 类会对每一个线程创建一个副本,用来保存其私有的数据,其他线程无法访问。简单方便且并发性好,在开发框架中被大量使用,比如 session 管理。
ThreadLocal 方法
ThreadLocal threadLocal = new ThreadLocal(); // 构造 ThreadLocal
ThreadLocal<T> threadLocal = new ThreadLocal<>(); // 支持泛型
threadLocal.get(); // 获取当前线程中保存的变量副本
threadLocal.set(10); // 设置当前线程中变量的副本
threadLocal.remove(); // 移除当前线程中变量的副本Copy to clipboardErrorCopied
ThreadLocal 示例
// 两个线程从同一个 MyThread 对象取值,但结果不同。
public class ThreadLocalExample {
public static void main(String[] args) {
MyThread t = new MyThread();
Thread thread1 = new Thread(t);
Thread thread2 = new Thread(t);
thread1.start();
thread2.start();
}
}
class MyThread implements Runnable {
private ThreadLocal threadLocal = new ThreadLocal();
@Override
public void run() {
threadLocal.set((int) (Math.random() * 100D));
try {
Thread.sleep(2000);
} catch (InterruptedException e) {}
System.out.println(threadLocal.get());
}
}
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。