网站的链接结构,国外html响应式网站,网络营销用什么软件,wordpress音乐分享一、ThreadLocal
1、介绍 可以实现资源对象的线程隔离#xff1b;可以实现了线程内的资源共享 如果使用 ThreadLocal 管理变量#xff0c;则每一个使用该变量的线程都获得该变量的副本#xff0c; 副本之间相互独立#xff0c;这样每一个线程都可以随意修改自己的变量副本…一、ThreadLocal
1、介绍 可以实现资源对象的线程隔离可以实现了线程内的资源共享 如果使用 ThreadLocal 管理变量则每一个使用该变量的线程都获得该变量的副本 副本之间相互独立这样每一个线程都可以随意修改自己的变量副本而不会对其他线程产生影响 2、常用方法
ThreadLocal() : 创建一个线程本地变量get() : 返回此线程局部变量的当前线程副本中的值initialValue() : 返回此线程局部变量的当前线程的初始值set(T value) : 将此线程局部变量的当前线程副本中的值设置为 value
3、编程
例子四个线程卖10张票 是分别卖10张票 import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class ThreadTest {public static void main(String[] args) {synchronizeThread st new synchronizeThread();new Thread(st, 1).start();new Thread(st, 2).start();new Thread(st, 3).start();new Thread(st, 4).start();}
}class synchronizeThread implements Runnable {ThreadLocalInteger ticketNumber new ThreadLocalInteger() {//创建实例对象Overrideprotected Integer initialValue() {return 10;//初始值}};Overridepublic void run() {for (int i 0; i 100; i) {if (ticketNumber.get() 0) {//get得到值System.out.println(线程【 Thread.currentThread().getName() 】卖出了一张票现在剩余了【 ticketNumber.get() 】张票);ticketNumber.set(ticketNumber.get() - 1);//set修改值} else {break;}}}
}4、原理 原理是为每个线程创建变量副本不同线程之间不可见保证线程安全。每个线程内部都维护了一个 ThreadLocalMapkey 为 threadLocal 实例value 为要保存的副本 使用 ThreadLocal 会存在内存泄露问题因为 key 为弱引用而 value 为强引用每次 GC 时 key 都会回收而 value 不会被回收所以一般使用 static 修饰 ThreadLocal可以随时获取 value。为了解决内存泄漏问题可以在每次使用完后删除 value 二、ThreadLocal 与其他同步机制
ThreadLocal 与同步机制都是为了解决多线程中相同变量的访问冲突问题ThreadLocal 并不能代替同步机制两者面向的问题领域不同。同步机制是为了同步多个线程对相同资源的并发访问是多个线程之间进行通信并且协同的有效方式而 ThreadLocal 是为了隔离多个线程的数据共享从而避免多个线程之间对共享资源的竞争也就不需要对多个线程进行同步了。ThreadLocal 采用以空间换时间的方法其他同步机制采用以时间换空间的方式ThreadLocal 适用的场景是多个线程都需要使用一个变量但这个变量的值不需要在各个线程间共享各个线程都只使用自己的这个变量的值。这样的场景下可以使用 ThreadLocal