ThreadLocal 与 synchronized 区别

我的理解

目的都是为了一个大前提:操作内容的线程安全。
任务不同:synchronized 解决的是多线程下线程操作权限的问题,以及原子性的保证。通过对锁的竞争,达到对资源的访问有序。
ThreadLocal是解决的事多线程下资源的隔离问题,即每个线程得到的都是资源的副本,这么一来每个线程都无法直接改变资源本身,也就不会造成线程不安全的情况。也因此ThreadLocal不适合需要对资源进行写操作的场景。

文心一言的详细范例

语雀文章快捷分享到CSDN的过程,可以大致分为以下几个步骤:synchronized 和 ThreadLocal 在 Java 中解决的是多线程编程中的不同问题,因此它们各自有其存在的必要性。
synchronized 关键字主要用于控制对共享资源的并发访问,确保同一时间只有一个线程能够执行某个代码块或方法。这是通过互斥(mutual exclusion)来实现的,即所谓的“锁”机制。当多个线程需要访问和修改同一份数据时,使用 synchronized 可以防止数据不一致和其他并发问题。
例如:

java复制代码public class SharedCounter {  private int count = 0;  public synchronized void increment() {  count++;  }  public synchronized int getCount() {  return count;  }  
}

在这个例子中,increment 和 getCount 方法都被 synchronized 修饰,以确保在任何时候只有一个线程能够修改 count 变量。
而 ThreadLocal 则是为了解决线程之间数据隔离的问题。ThreadLocal 提供了一种线程局部(thread-local)变量。这些变量不同于它们的正常变量,因为每一个访问这个变量的线程都有其自己独立初始化的变量副本。这意味着,如果你有一个 ThreadLocal 变量,每个线程操作的都是它自己的数据副本,而不是共享的数据。这对于避免线程间的数据污染和简化并发编程非常有用。
例如:

java复制代码public class ThreadLocalExample {  private static final ThreadLocal<Integer> threadLocal = new ThreadLocal<>();  public static void main(String[] args) {  Thread thread1 = new Thread(() -> {  threadLocal.set(1); // 设置线程1的ThreadLocal变量  System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get()); // 输出:Thread-0: 1  });  Thread thread2 = new Thread(() -> {  threadLocal.set(2); // 设置线程2的ThreadLocal变量  System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get()); // 输出:Thread-1: 2  });  thread1.start();  thread2.start();  }  
}

在这个例子中,threadLocal 是一个 ThreadLocal 类型的变量。每个线程(thread1 和 thread2)都设置了它自己的 threadLocal 变量的值,并且获取到的也是它自己的值。ThreadLocal 变量在线程之间是隔离的,因此每个线程都可以独立地操作它自己的数据,而不用担心其他线程的干扰。
总结来说,synchronized 和 ThreadLocal 各自解决了多线程编程中的不同问题:synchronized 用于控制对共享资源的访问,而 ThreadLocal 用于提供线程局部的数据存储,避免线程间的数据共享和冲突。在某些复杂的并发场景中,你可能会同时使用这两者来确保数据的正确性和线程的安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/730513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql学习笔记之事务详解(读未提交、读以提交、可重复读、串行化读)

在这个博主的基础上&#xff0c;增加两种情况的对比&#xff1a;https://blog.csdn.net/llllllkkkkkooooo/article/details/108068919 可重复读中幻读现象&#xff08;未使用MVCC&#xff09; 设置可重复读的隔离级别 set global transaction isolation level repeatable read…

「解析文件流,Java之FileOutputStream助您轻松操作文件!」

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…

【物联网设备端开发】Arduino IDE的ModbusRTU, ModbusTCP库

一、ModbusRTU, ModbusTCP and ModbusTCP Security 有关图书馆的使用详情&#xff0c;请查阅相关文档部分。 二、功能 支持所有Arduino平台在多个实例的任意组合中运行 Modbus RTU 主站Modbus RTU 从站Modbus TCP 主站 支持 ESP8266/ESP32 和 Ethernet libraryModbus TCP 从…

TCP重传机制、滑动窗口、拥塞控制

一、总述 TCP&#xff0c;Transmission Control Protocol&#xff0c;是一个面向连接、基于流式传输的可靠传输协议&#xff0c;考虑到的内容很多&#xff0c;比如数据包的丢失、损坏、分片和乱序等&#xff0c;TCP协议通过多种不同的机制来实现可靠传输。今天&#xff0c;重点…

复试人工智能前沿概念总结

1.大模型相关概念&#xff08;了解即可&#xff09; 1.1 GPT GPT&#xff0c;全称为Generative Pre-training Transformer&#xff0c;是OpenAI开发的一种基于Transformer的大规模自然语言生成模型。GPT模型采用了自监督学习的方式&#xff0c;首先在大量的无标签文本数据上进…

Android使用WebView打开内嵌H5网页

Android打开外部网页链接请参考上一篇文章 https://public.blog.csdn.net/article/details/136384559 继上篇&#xff0c;新建assets文章夹&#xff0c;将H5的网页资源放到此文件夹下 把H5的资源文件都拷进来 这个时候&#xff0c;将添加打开本地网页的代码&#xff1a; //打…

SpringCloud-实现一个基本的消息队列

消息队列是一种用于在应用程序之间传递消息的关键组件&#xff0c;它能够提高系统的可伸缩性和可靠性。在这篇文章中&#xff0c;我们将探讨如何实现一个基本的消息队列&#xff0c;了解其核心概念和基本原理。 什么是消息队列&#xff1f; 消息队列是一种通信方式&#xff0…

webpack5基础--05_处理图片资源

处理图片资源 过去在 Webpack4 时&#xff0c;我们处理图片资源通过 file-loader 和 url-loader 进行处理 现在 Webpack5 已经将两个 Loader 功能内置到 Webpack 里了&#xff0c;我们只需要简单配置即可处理图片资源 1. 配置 const path require("path");modul…

【活动】2024年AI辅助研发:深度变革与无限潜力

作为一名前端程序员&#xff0c;深入探讨2024年AI在软件研发领域的应用趋势及其影响&#xff0c;我们可以看到一场引人注目的转型正在发生。AI辅助研发对于前端开发而言&#xff0c;不仅意味着效率的飞跃&#xff0c;更是在用户体验设计、代码编写、性能优化、项目管理等诸多方…

Java零基础 - 数组的定义和声明

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

httprunner用例结构(前后置)

说明&#xff1a;httprunner 结合 pytest 的前后置方式 1. 用例级别前后置 1.1. setup teardown class TestCaseRefTestcase(HttpRunner):# 用例级别前后置def setup(self):logger.warning("------用例级别前置")def teardown(self):logger.warning("------用…

在Vue中处理接口返回的二进制图片数据

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

Python的反射

通过字符串的形式操作对象的属性 class Person(object):def __init__(self,name,age) -> None:self.namenameself.ageagedef walking(self):print("walking......")获取对象的属性 pPerson("Recardo",12) # 获取队形的name属性 agetattr(p,"nam…

Android使用WebView打开外部网页链接

发布Android应用&#xff0c;除了用原生开发外&#xff0c;更多是采用内嵌H5网页的方式来做&#xff0c;便于更新以及多平台使用。 一、第一种方式是直接通过WebView打开外部H5链接。 新建Android工程 直接创建一个工程&#xff0c;点击运行就可以了&#xff0c;打开是个空页…

2024 批量下载公众号文章内容/阅读数/在看数/点赞数/留言数/粉丝数导出pdf文章备份(带留言):公众号记忆承载近1500篇历史文章在线查看,找文章方便了

关于公众号文章批量下载&#xff0c;我之前写过很多文章&#xff1a; 视频更新版&#xff1a;批量下载公众号文章内容/话题/图片/封面/音频/视频&#xff0c;导出html&#xff0c;pdf&#xff0c;excel包含阅读数/点赞数/留言数 2021陶博士2006/caoz的梦呓/刘备我祖/六神读金…

安卓Java面试题 51-60

&#x1f525;51、如何判断Android APP应用被强制杀死&#xff1f;&#x1f525; 可以在Application中定义一个static常量&#xff0c;赋值为-1&#xff0c;然后在欢迎页面修改值为0&#xff0c;如果被强杀&#xff0c;Application被重新初始化&#xff0c;这个时候如果父Activ…

Java零基础 - Java中的label和assert语句

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

打造禹州中医药大模型,以AI驱动业务创新(内附孙思邈GPT内测版)

大禹智库 第78 期&#xff08;总第409 期&#xff09; 2024年 3 月 4 日 在中医药传承与发展的关键时期&#xff0c;结合许昌市的地域特色和产业优势&#xff0c;大禹智库提出“打造禹州中医药大模型&#xff0c;以AI驱动业务创新”的战略构想。本报告围绕构建禹州中医药现代化…

旅游陪同翻译,英译中需要具备什么能力!

随着中国旅游业的蓬勃发展&#xff0c;越来越多的外国游客选择踏足这片充满魅力的土地。然而&#xff0c;语言障碍常常成为他们探索中国文化的绊脚石。在这时&#xff0c;旅游陪同翻译应运而生&#xff0c;为游客提供了便捷的语言沟通服务&#xff0c;让他们的旅程更加顺畅和愉…