多线程浅析1_ThreadLocal与Volatile用法

本文介绍了ThreadLocal机制,展示了如何使用ThreadLocal为每个线程分配独立的变量副本,避免了线程间的数据同步问题。此外,还探讨了Volatile关键字的作用及用法,确保多线程环境下数据的一致性和可见性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ThreadLocal用法

1.ThreadLocal

通过get获取线程中的Map

 import java.util.concurrent.atomic.AtomicInteger;

 public class ThreadId {
     // Atomic integer containing the next thread ID to be assigned
     private static final AtomicInteger nextId = new AtomicInteger(0);

     // Thread local variable containing each thread's ID
     private static final ThreadLocal<Integer> threadId =
         new ThreadLocal<Integer>() {
             @Override protected Integer initialValue() {
                 return nextId.getAndIncrement();
         }
     };

     // Returns the current thread's unique ID, assigning it if necessary
     public static int get() {
         return threadId.get();
     }
 }

接着,我们可以使用两个线程去分别读取ThreadLocal中的值,我们会发现并不会发生两个值有并行的问题,这也是ThreadLocal的设计思想,为了解决线程同步的问题,我们将ThreadLocal中的值复制到每一个线程中。

子线程和父线程的数据传递

InheritableThreadLocal允许子线程和父线程进行数据传递。

ThreadLocal的图示如下:

这里写图片描述

总结:ThreadLocal主要为了在多线程中,防止同步的问题而设置的。每个线程均存在单独的线程内存。

Volatile

Volatile的用法

在多线程的操作中,为了保证所有的线程中访问的数据一致,使用Volatile关键字,使得每次的读取都在主内存而不是在缓存中读取,防止脏读。

保证主内存中一直保存着最新数据,而不是cache为主的保存

这里写图片描述

Example:

public class MyClass {
    private int years;
    private int months
    private volatile int days;


    public void update(int years, int months, int days){
        this.years  = years;
        this.months = months;
        this.days   = days;
    }
}

如果包含一个volatile属性,那么对三个属性同时更新的时候,三个属性都会一起写入主内存。

一个光使用Volatile关键字也不够的例子,解决的办法包括使用同步代码块,保证一个时间只有一个线程能对数据进行操作
这里写图片描述

Condition

未完待续。。。

Reentrant Lock

未完待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值