ThreadLocal和线程同步都是为了解决多线程中相同变量的访问冲突问题,那么,二者的区别在哪里?和线程同步机制对比,ThreadLocal有什么优势?

  1. 同步机制中通过对象的锁机制保证同一时间只有一个线程来访问变量,这是该变量是多个线程共享的,使用同步机制要缜密的分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放掉锁等复杂的问题,程序设计和编写难度大
  2. ThreadLocal则为每一个线程提供了一个独立的变量副本,从而隔离了多个线程对访问数据的冲突。因为每一个线程都有自己的变量副本,从而也就没有必要进行同步了。ThreadLocal提供了线程安全的对象的封装,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。
  3. 由于ThreadLocal可以持有任意类型的对象,低版本的jdk所提供的get()方法的返回值是object类型的。需要进行强制类型转换。但是jdk5.0以后就是用了泛型从而解决了该问题。
  4. 总的来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间的”方式——访问串行化,对象共享化。而ThreadLocal则采用了“以空间换时间”的方式:访问并行化,对象独享化。前者仅提供一份变量,让不同的线程队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
下面提供一个简单的ThreadLocal的实现版本:
<span style="font-size:18px;">public class SimpleThreadLocal
{private  Map valueMap= Collections.synchronizedMap(new HashMap)public void  set (Object newValue){valueMap.put(Thread.currentThread(),newValue);}public Object get(){Thread currentThread = Thread.currentThread();Object o = valueMap.get(currentThread);if(null == o &&!valueMap.containsKey(currentThread)){o = initialValue();valueMap.put(currentThread,o);}return o;}public void remove(){valueMap.remove(currentThread);}public Object initialValue(){return null;}
}</span>

图中代码所示的思路和JDK所提供的ThreadLocal类在实现思路上是很接近的。

ThreadLocal和线程同步机制的对比相关推荐

  1. Java高级-线程同步机制实现

    2019独角兽企业重金招聘Python工程师标准>>> 前言 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Threa ...

  2. Java多线程之线程同步机制(锁,线程池等等)

    Java多线程之线程同步机制 一.概念 1.并发 2.起因 3.缺点 二.三大不安全案例 1.样例一(模拟买票场景) 2.样例二(模拟取钱场景) 3.样例三(模拟集合) 三.同步方法及同步块 1.同步 ...

  3. 01 线程同步机制封装类

    01 线程同步机制封装类 RAII RAII全称是"Resource Acquisition is Initialization",直译过来是"资源获取即初始化" ...

  4. Python线程同步机制: Locks, RLocks, Semaphores, Condition

    为什么80%的码农都做不了架构师?>>>    翻译自Laurent Luce的博客 原文名称:Python threads synchronization: Locks, RLoc ...

  5. 解析JVM线程同步机制

    http://blog.csdn.net/thl789/article/details/566494 对多线程的支持一般是在OS级的,而Java将其做在了语言级别,这其中最吸引人的莫过于Java对线程 ...

  6. c++ linux 线程等待与唤醒_C++ Linux线程同步机制:POSIX信号量,互斥锁,条件变量...

    线程同步机制:POSIX 信号量,互斥量,条件变量 POSIX 信号量 常用的POSIX 信号量函数为如下5个: sem_init sem_destroy sem_wait sem_trywait s ...

  7. 学习java的第四十天,线程的优先级、守护线程、线程同步机制、死锁

    一.线程的优先级(priority) Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行. 线程的优先级用数字表示,范围1~10 Thr ...

  8. 线程同步机制synchronized中锁的判断以及锁的作用范围

    当我们使用多个线程访问同一资源(可以是同一个变量.同一个文件.同一条记录等)的时候,若多个线程只有读操作,那么不会发生线程安全问题,但是如果多个线程中对资源有读和写的操作,就容易出现线程安全问题. 要 ...

  9. 对Java多线程编程的初步了解,实现多线程的三种方式以及多线程并发安全的线程同步机制

    什么叫进程?什么叫线程? 进程相当于一个应用程序,线程就是进程中的一个应用场景或者说是一个执行单元,一个进程可以启动多个线程,每个线程执行不同的任务,一个线程不能单独存在,他必须是进程的一部分,当进程 ...

最新文章

  1. KeDelayExecutionThread使用注意
  2. Mysql之alter用法汇总
  3. python获取文件夹下文件_Python获取目录下的所有文件
  4. STM32—— AHB、APB详解
  5. Discuz添加自定义模板广告
  6. mfc 子窗体 按钮不触发_VBA与Excel入门——用户窗体1
  7. NVIDIA TESLA M40
  8. 澳洲留学转专业计算机科学,澳洲留学热门专业计算机优势
  9. Java统计文件行数
  10. 使用Dockerfile构建Nginx,Tomcat,MySQL镜像
  11. WEB-ERROR-PAGE
  12. HTML5基于flash实现播放RTMP协议视频
  13. The proxy server is refusing connections 怎么解决呢?
  14. unity 自定义管线SRP 学习笔记(一)搞懂WHY WHAT HOW
  15. Fspecial函数用法
  16. html img返回上级目录,HTML相对路径 上级目录及下级目录的写法_HTML/Xhtml_网页制作...
  17. 关于Web 验证方法你知道几种
  18. Teardrop代码编程
  19. 写一款汽车维修保养软件,让维修保养管理更加轻松,JavaScript 作用域
  20. java毕业设计基于的测试项目管理平台Mybatis+系统+数据库+调试部署

热门文章

  1. “约见”面试官系列之常见面试题第二十七篇之vue-router的重要属性
  2. 前端学习(1997)vue之电商管理系统电商系统之渲染tab栏标签
  3. oracle之基本的sql_select语句之课后练习
  4. 前端学习(77):css中常见margin塌陷问题之解决办法
  5. spring mvc学习(9):路径参数
  6. java学习(141):自定义捕捉异常
  7. 前端利用CryptoJS进行AES对称加解密(16进制编码)
  8. HTML DOM之标签操作方法
  9. Linux select函数用法和原理
  10. webdriver高级应用- 无人工干预地自动下载某个文件