学习笔记 | 线程安全?如何实现?加锁、非阻塞同步、线程本地化

本文深入解析线程安全的概念,探讨其在多线程环境中对全局变量的影响,以及如何通过加锁、非阻塞同步和线程本地化等方法实现线程安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程安全?如何实现?

  1. 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
  2. 线程安全问题都是由全局变量及静态变量引起的。
  3. 若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的; 若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。
对于线程不安全的对象我们可以通过如下方法来实现线程安全:
  • 加锁 利用 Synchronized 或者 ReenTrantLock 来对不安全对象进行加锁,来实现线程执行的串行化,从而保证多线程同时操作对象的安全性,一个是语法层面的互斥锁,一个是 API 层面的互斥锁
  • 非阻塞同步来实现线程安全。原理就是: 通俗点讲,就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了; 如果共享数据有争用,产生冲突,那就再采取其他措施(最常见的措施就是不断地重试,直到成功为止)。这种方法需要硬件的支持, 因为我们需要操作和冲突检测这两个步骤具备原子性。通常这种指令包括 CAS SC,FAI TAS等。
  • 线程本地化,一种无同步的方案,就是利用 Threadlocal来为每一个线程创造一个共享变量的副本来(副本之间是无关的)避免几个线程同时操作一个对象时发生线程安全问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值