CAS算法和ThreadLocal


CAS操作是一种乐观锁技术,是指在操作数据之前先判断数据是否修改过(通过预期值与内存值比较是否相等来判断),只有当数据没被修改过的时候,才写入数据;注意CAS操作存在ABA问题,即A被修改为B又被修改为A,导致无法判断A是否变化过,解决该问题可以通过引入版本号等手段

ThreadLocal类及应用技巧

JDK1.5提供了ThreadLocal类来方便实现线程范围内的数据共享

每个线程调用全局ThreadLocal对象的set方法,就相当于往其内部的map集合中增加一条记录,key就是各自的线程,value就是各自的set方法传进去的值。

在线程结束时可以调用ThreadLocal.clear()方法用来更快释放内存,也可以不调用,因为线程结束后也可以自动释放相关的ThreadLocal变量。

一个ThreadLocal对象只能记录一个线程内部的一个共享变量,需要记录多个共享数据,可以创建多个ThreadLocal对象,或者将这些数据进行封装,将封装后的数据对象存入ThreadLocal对象中。

将数据对象封装成单例,同时提供线程范围内的共享数据的设置和获取方法,提供已经封装好了的线程范围内的对象实例,使用时只需获取实例对象即可实现数据的线程范围内的共享,因为该对象已经是当前线程范围内的对象了

防止多线程访问共享资源产生异常结果的另外一种方式是消除资源的共享,可以使用线程本地存储ThreadLocal达到这样的效果,即为每个线程创建一个共享资源的存储,从而消除多个线程对该资源的共享访问;

可以通过get和set方法访问该对象的内容,每个线程对value的访问相互独立,互不干扰,因为它们访问的本来就不是同一个资源


猜你喜欢

转载自blog.csdn.net/adrian_dai/article/details/79438459