线程安全与锁优化入门

在每个进程的内存空间中都会有一块特殊的公共区域,通常称为堆(内存)。进程内的所有线程都可以访问到该区域,这就是造成问题的潜在原因。

3种无同步方案:

  1. 私有的东西就不该让别人知道 操作系统会为每个线程分配属于它自己的内存空间,通常称为栈内存,其它线程无权访问。局部变量(方法中的变量,会在每个线程的栈内存中都分配一份)
  2. 人人有份 按照主流编程语言的规定,类的成员变量不能再分配在线程的栈内存中,而应该分配在公共的堆内存中。那怎么保证在公共区域的东西安全呢?答案就是,人人有份。ThreadLocal(就是把堆内存中的一个数据复制N份,每个线程认领1份,同时规定好,每个线程只能玩自己的那份,不准影响别人的。这N份数据都还是存储在公共区域堆内存里的。)
  3. 只能看,不能摸 这种情况就属于,只能读取,不能修改。其实就是常量或只读变量,它们对于多线程是安全的,想改也改不了。final

同步方案:

  1. 悲观锁-互斥锁 公共区域(堆内存)的数据,要被多个线程操作时,为了确保数据的安全(或一致)性,需要在数据旁边放一把锁,要想操作数据,先获取锁再说吧
  2. 乐观锁-假设我的数据不会被意外修改,如果修改了,就放弃,从头再来。 CAS(Compare And Swap)。就是在并发很小的情况下,数据被意外修改的概率很低,但是又存在这种可能性,此时就用CAS。CAS中的ABA问题,加版本号解决。

在这里插入图片描述
Come from OneNote…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值