保证线程安全的时候什么情况下使用 atomic 和 锁

保证线程安全的时候什么情况下使用 atomic 和 锁

一:atomic介绍

atomic 使用的是硬件层cas原子性来保证的并发安全,
也就是当某个操作执行时,要么全部成功,要么全部失败,不允许其他操作中途插入进来.

二:哪些操作是原子性的:

1.像java、golang等一些语言 基本类型都是有做原子性的操作的,所以我们对于基本类型,
如果只是单操作的话,比如赋值,是可以当作并发安全的.
但是如果是多操作 比如 a=a+1 这样就是不行的
因为其中有多个操作步骤 1.获取a的值 2.a的值+1 3.把新值给a
像这种复合操作,整体就不是原子性的了.

2.像其他不是基本类型的,比如自定义类,又或者是string,
本质上就不是原子性的
所以说就算是单操作,也不是并发安全
例如 给a 赋值 , 两个线程赋予不同的值,
但是第一个线程赋值赋到一半的时候,另外一个线程插入进来一起赋值,就会出现混乱,
从而造成并发不安全.
那么使用atomic和锁都是能解决这样的问题.

三:atomic和锁的应用场景

1.atomic
atomic使用的是硬件cas原子性来保证的,相当于走的是乐观机制,他是相信大几率不会发生线程碰撞,如果发生就会不停的去获取执行资源权利,坏处就是资源消耗大,而且在这途中对于共享变量还不允许线程切换,好处就是速度快,因为是硬件层面的保障,所以速度还要在业务层面乐观锁之上.
应用场景:基本类型和简单操作,类似于a=a+1

1.锁
锁在不同的语言会有很多种实现,还会有很多种不同的锁,比如读写锁,乐观锁吗,互斥锁太多了,但是他们通用的点,一般是会进行线程切换的,所以当其中一个线程获取不到资源会有一定的机制让他下次在获取资源,不会让自己永无止境的消耗资源,也不会剥夺其他线程切换的权利.
应用场景:复杂的操作.尤其是io操作.

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值