当前位置: 首页 > news >正文

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.lryc.cn/news/313880.html

相关文章:

  • 灵魂指针,教给(二)
  • 线程安全--浅谈Ad-hoc与加锁的区别
  • 数据治理实战——翼支付金融板块业务数仓建设和数据治理之路
  • [Buuctf] [MRCTF2020]Transform
  • 【C++】C++模板基础知识篇
  • golang 注释插件
  • Unity插件之天气系统UniStorm
  • Java使用xlsx-streamer和EasyExcel解决读取超大excel文件数据处理方法
  • 智能驾驶规划控制理论学习04-基于车辆运动学的规划方法
  • 一键查看:大厂网站都用了啥技术栈,有图有真相。
  • C语言-指针(下)
  • 尚硅谷JavaScript高级学习笔记
  • 六、长短时记忆网络语言模型(LSTM)
  • Filter过滤器+JWT令牌实现登陆验证
  • SQL学习十八~十九
  • 2024 AI 辅助研发的新纪年
  • 【牛客】HJ87 密码强度等级 CM62 井字棋
  • 【论文速读】 | DeGPT:通过大语言模型优化反编译器输出
  • 【DP】蓝桥杯第十三届-费用报销
  • 15. C++泛型与符号重载
  • 老司机都懂的!【打赏】完美运营的最新视频打赏系统
  • JavaWeb笔记 --- 二、Maven
  • 【C++】C++11---右值引用和移动语义
  • 消息队列-kafka-消息发送流程(源码跟踪) 与消息可靠性
  • 机器学习笔记 计算机视觉中的测距任务常见技术路线
  • 云计算 3月8号 (wordpress的搭建)
  • 【CSS】(浮动定位)易忘知识点汇总
  • Vitual Box虚拟机打开后,键盘鼠标失效
  • 宠物空气净化器值得入手吗?选购宠物空气净化器关注哪些方面?
  • 前端发起请求,后端模型需处理很久,怎样设置前端直接完成请求响应,后端计算完在返回结果给前端?