ThreadLocal和synchronized的区别

ThreadLocal和synchronized的区别是:synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。从始至终,只存在一个资源,然后多个线程都去访问,那么就得排队,依次访问。而ThreadLocal可以部分解决synchronized排队问题,为每一个线程都提供了变量的副本,牺牲内存,提升效率。

ThreadLocal和synchronized的区别-Worktile社区

synchronized

synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。从始至终,只存在一个资源,然后多个线程都去访问,那么就得排队,依次访问。

缺点:效率低,得排队

synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。它包括两种用法:synchronized 方法和 synchronized 块。

Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻非常多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍可以访问该object中的非加锁代码块。

ThreadLocal

ThreadLocal是Thread的局部变量,用于编多线程程序,对解决多线程程序的并发问题有一定的启示作用。而ThreadLocal可以部分解决synchronized排队问题,为每一个线程都提供了变量的副本,牺牲内存,提升效率。

缺点:使得每个线程在某一时间访问到的并不是同一个对象,这样就违背了多个线程对数据的数据共享,因此,需要在一定的场景下才能使用,即允许备份的存在;反之,如果不允许备份,就不能使用。

ThreadLocal并不能替代synchronized:举个不恰当的例子,夫妻离婚,有个儿子,抚养权划给其中一个人,那么夫妻只能轮流探视,你没办法复制一个儿子出来,让双方都有一个儿子!

为了说明多线程访问对于类变量和ThreadLocal变量的影响,QuerySvc中分别设置了类变量sql和ThreadLocal变量,这种场景类似web应用中多个请求线程携带不同查询条件对一个servlet实例的访问,然后servlet调用业务对象,并传入不同查询条件,最后要保证每个请求得到的结果是对应的查询条件的结果。

延伸阅读:

synchronized 方法

1.方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前.这时,线程获得的是成员锁,即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候,当前线程(就是在synchronized方法内部的线程)执行完该方法后,别的线程才能进入.

如在线程t1中有语句obj.synMethod(); 那么由于synMethod被synchronized修饰,在执行该语句前, 需要先获得调用者obj的对象锁, 如果其他线程(如t2)已经锁定了obj (可能是通过obj.synMethod,也可能是通过其他被synchronized修饰的方法obj.otherSynMethod锁定的obj), t1需要等待直到其他线程(t2)释放obj, 然后t1锁定obj, 执行synMethod方法. 返回之前释放obj锁.

2.对某一代码块使用,synchronized后跟括号,括号里是变量,这样,一次只有一个线程进入该代码块.此时,线程获得的是成员锁.

3.synchronized后面括号里是一对象,此时,线程获得的是对象锁.

对于3,如果线程进入,则得到当前对象锁,那么别的线程在该类所有对象上的任何操作都不能进行.在对象级使用锁通常是一种比较粗糙的方法。为什么要将整个对象都上锁,而不允许其他线程短暂地使用对象中其他同步方法来访问共享资源?如果一个对象拥有多个资源,就不需要只为了让一个线程使用其中一部分资源,就将所有线程都锁在外面。

文章标题:ThreadLocal和synchronized的区别,发布者:小编,转载请注明出处:https://worktile.com/kb/p/37874

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小编小编认证作者
上一篇 2023年2月13日 上午2:07
下一篇 2023年2月13日 上午2:09

相关推荐

  • 步骤指南:在研发团队中实施负责人制度

    在研发团队中实施负责人制度的步骤指南:一、明确负责人角色与职责;二、选拔合适的负责人;三、培训与发展;四、建立有效的沟通机制;五、制定明确的考核与奖惩机制;六、加强团队建设与文化建设;七、持续优化负责人制度。通过不断改进和完善这一制度,研发团队将能够更好地应对挑战,提高工作效率和质量,从而为组织的成功做出贡献。

    2023年11月12日
    50300
  • 有什么软件可以记录上班工时

    可以记录上班工时的软件有:一、Toggl;二、Clockify;三、RescueTime;四、Everhour。Toggl是一款追踪和记录开销时间方式的应用工具,无论是在工作中,还是休闲在家中,Toggl都能够非常容易地快速记录和追踪用户各种活动所花费的时间。Toggl能够方便地记录员工的时间和任务…

    2023年4月30日
    69900
  • 项目进度怎么写

    写项目进度需要以下几点:1、确定报告格式和内容;2、收集项目进度数据;3、分析项目进度数据;4、编写项目进度报告;5、发送和共享项目进度报告。项目进度报告通常包括以下内容:项目基本信息(项目名称、项目经理、项目周期等)。 1、确定报告格式和内容 项目进度报告通常包括以下内容: – 项目基本信息(项目…

    2023年2月26日
    2.1K00
  • yolo用什么编程语言

    YOLO 主要使用的编程语言是 C++ 和 Python。 在这两种语言中,C++ 被用于实现算法的底层逻辑,以达到高效率的目标。它的速度快、性能高,非常适合深度学习算法和图像处理等计算密集型任务。而 Python 通常用于高层次的接口设计和结果展示,因为它简单易用,有着丰富的库支持,非常适合快速原…

    2024年4月26日
    600
  • okr怎么写|OKR

    OKR实质上是一种目标设定框架,用于确保公司及其员工目标一致, 助力发展。写好OKR的要点涉及:1、清晰定义关键结果,2、采用可度量标准,3、目标应富有挑战性,4、保持更新和回顾。 其中,清晰定义关键结果指的是明确并期望达成的具体成果,这是衡量进度的依据。 一、OKR的定义与原则 Objective…

    2024年1月17日
    29500
  • 字和字节的区别

    字和字节的区别有:1、本质区别;2、概念区别;3、制式区别。字节是寻址的最小单位。内存中两个紧挨着的字节,它们的内存地址差1。但是一个字节内的位,就没有地址的概念。字是计算机一次处理数据的最大单位,字是用于表示其自然的数据单位的术语。 1、本质区别 字节是寻址的最小单位。内存中两个紧挨着的字节,它们…

    2023年2月14日
    5.7K00
  • Java中的Web开发框架有哪些

    Java中的Web开发框架主要包括Spring Boot、Spring MVC、Struts 2、Hibernate、JavaServer Faces(JSF)、Vaadin、GWT、Play Framework和Vert.x等。Spring Boot 是目前极受欢迎的一个开发框架,它通过简化配置来…

    2024年1月8日
    49400
  • 手工编程有什么好处

    手工编程的好处包括1、提高问题解决技能、2、增强代码理解力、3、促进深度学习、4、提升自主编程能力。在这些好处中,提高问题解决技能尤为重要。手工编程经常要求开发者深入分析问题,设计合适的算法,并编写出高效的代码来解决问题。这个过程可以锻炼开发者的逻辑思维能力,经过持续练习,他们能更快地识别问题的核心…

    2024年4月26日
    800
  • 哪些数据库适合聊天记录的管理,比较优缺点

    适合聊天记录管理的数据库有:一、MySQL;二、MongoDB;三、PostgreSQL;四、Redis。MySQL是一种开源的关系型数据库管理系统,被广泛用于Web应用程序和中小型企业。MySQL使用SQL语言进行数据管理,支持高并发和可扩展性。对于聊天记录管理,MySQL是一个不错的选择。 一、…

    2023年6月11日
    1.7K00
  • 公司如何去管理项目部

    项目管理是确保项目成功实施的关键环节。公司管理项目部需要实施一系列策略:首先要建立团队并确定责任,制定清晰的项目计划、实施绩效评估,使用合适的项目管理工具、进行有效的风险管理,以及确保沟通顺畅。这些策略之中,建立一个专业的团队并明确每个成员的责任是项目管理的基础。团队成员必须拥有所需的技能和经验,并…

    2024年4月10日
    7500

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部