ThreadLocal与Synchronized的使用
来源:互联网 发布:光纤星型网络结构 编辑:程序博客网 时间:2024/06/02 00:46
1.ThreadLocal 是什么?
ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些。
那么ThreadLocal也是变量,该变量解决了什么问题呢?
ThreadLocal解决了变量在同一个线程内部之间的传递。
ThreadLocal首先不是解决线程安全问题,最显而易见的原因是ThreadLocal内部保存的变量在多线程之间不共享。数据都不共享,谈何线程安全?当然了,如果ThreadLocal内部保存的变量本事就是一个多线程共享的数据,那么还是会有线程安全的问题的。如果没有ThreadLocal,我们需要在同一个线程之内共享的数据大约只能通过方法传递了。这样可能会让代码显得杂乱。
总结:
定义:线程本地变量。
作用于:线程内部。
生命周期:伴随线程执行始终,线程结束,变量生命结束。
共享性:多个线程之间不共享。
2.ThreadLocal和Synchronized本质区别:
Synchronized采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间的方式”。前者提供一份变量,让不同的线程排队访问,而后者为每一个线程提供了一份变量,因此访问而互不影响。
因此,Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。
3.ThreadLocal的实例:
public class ThreadLocalTest implements Runnable{ ThreadLocal<Studen> studenThreadLocal = new ThreadLocal<Studen>(); @Override public void run() { String currentThreadName = Thread.currentThread().getName(); System.out.println(currentThreadName + " is running..."); Random random = new Random(); int age = random.nextInt(100); System.out.println(currentThreadName + " is set age: " + age); Studen studen = getStudent(); //通过这个方法,为每个线程都独立的new一个student对象,每个线程的的student对象都可以设置不同的值 studen.setAge(age); System.out.println(currentThreadName + " is first get age: " + studen.getAge()); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println( currentThreadName + " is second get age: " + studen.getAge()); } private Studen getStudent() { Studen studen = studenThreadLocal.get(); if (null == studen) { studen = new Studen(); studenThreadLocal.set(studen); } return studen; } public static void main(String[] args) { ThreadLocalTest t = new ThreadLocalTest(); Thread t1 = new Thread(t,"Thread A"); Thread t2 = new Thread(t,"Thread B"); t1.start(); t2.start(); }}class Studen{ int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; }}
运行结果:
Thread B is running…
Thread B is set age: 43
Thread B is first get age: 43
Thread A is running…
Thread A is set age: 53
Thread A is first get age: 53
Thread B is second get age: 43
Thread A is second get age: 53
4.Synchronized的实例:
public class MultiThreadTest implements Runnable{ Studen studen = new Studen(); @Override public void run() { String currentThreadName = Thread.currentThread().getName(); System.out.println(currentThreadName + " is running ...."); //同步 synchronized (studen) { Random random = new Random(); int age = random.nextInt(100); studen.setAge(age); System.out.println(currentThreadName + " is set age: " + age); System.out.println(currentThreadName + "is first get age: " + studen.getAge() ); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(currentThreadName + " is second get age: " + studen.getAge() ); } } public static void main(String[] args) { MultiThreadTest m = new MultiThreadTest(); Thread t1 = new Thread(m,"Thread A"); Thread t2 = new Thread(m,"Thread B"); t1.start(); t2.start(); }}class Student { int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; }}
5.ThreadLocal使用的一般步骤
1、在多线程的类(如ThreadDemo类)中,创建一个ThreadLocal对象threadXxx,用来保存线程间需要隔离处理的对象xxx。
2、在ThreadDemo类中,创建一个获取要隔离访问的数据的方法getXxx(),在方法中判断,若ThreadLocal对象为null时候,应该new()一个隔离访问类型的对象,并强制转换为要应用的类型。
3、在ThreadDemo类的run()方法中,通过getXxx()方法获取要操作的数据,这样可以保证每个线程对应一个数据对象,在任何时刻都操作的是这个对象。
- ThreadLocal与Synchronized的使用
- ThreadLocal与Synchronized的使用场景
- ThreadLocal与Synchronized的使用场景
- ThreadLocal与Synchronized的使用场景
- ThreadLocal与Synchronized的使用场景
- ThreadLocal与Synchronized的使用场景
- ThreadLocal与Synchronized的用法
- ThreadLocal与Synchronized的用法
- ThreadLocal与Synchronized的用法
- ThreadLocal与synchronized的区别
- ThreadLocal与Synchronized的用法
- ThreadLocal与Synchronized的用法
- ThreadLocal与synchronized的分析
- ThreadLocal用法及与Synchronized的区别
- Synchronized和ThreadLocal使用的比较
- 详解ThreadLocal与synchronized
- ThreadLocal与synchronized
- ThreadLocal与synchronized
- 关于C++调用C#语言DLL(类库)
- TCP 回射程序(处理子进程的SIGCHLD信号)
- EventBus的使用
- 寻找sql注入的网站的方法
- PowerPC在信号处理中的应用
- ThreadLocal与Synchronized的使用
- Swift下多个Storyboard的项目结构
- 【24.58%】【BZOJ 1001】狼抓兔子
- 【JAVA基础】net.sf.json.JSONObject 和org.json.JSONObject 的差别
- 使用dd命令测试磁盘读写性能
- level 配合substr 和instr 进行字符串截取
- ctags一些命令
- IP地址与整形的相互转换原理 (Python实现)
- 怎么解决facbook被封禁的问题?