谈一下线程之间为什么是不可见的

前言:

因为最近刚学习线程相关的知识,所以想在此做一下笔记,顺带借此机会说一下自己对于相关知识的 理解以供参考;如在本文中发现有任何不妥的地方,请在评论区评论或与作者联系,以供修正;最后希望能在csdn这个平台与大家一起学习,共同进步。

 正文:

关于线程之间为什么是不可见的,谈到这个问题时我觉得有必要先了解一下线程执行时的一个内存空间;在Java中每一个的线程都有一块独立的内存空间,俗称线程工作区,当它们去执行临界区的资源(共享资源)时,都会先去主内存将共享资源复制一份到自己的工作内存中再进行操作,最后再把操作完的副本写入到主内存中;看似表面上是直接操作了共享资源,其实实际上是操作了共享资源的副本;

为了方便理解我画了流程图,如下:

线程内存之间的关系图:

 线程运行时的具体流程:

基于以上线程的执行机制:线程每次执行时都是要先拿取资源的副本,再在自己的工作内存里进行操作,最后再写入到主内存资源中;那这时容易出现一种情况,例如当多个线程要修改同一资源时,一个线程优先去复制了资源在自己内存进行操作时,突然某一线程趁机也偷偷的把资源复制到自己工作内存中操作,这时原先的那个先执行的线程执行完了操作把副本内容写入了主内存中时,偷偷摸摸的那个线程也跟着执行完了把结果写入到了主内存后,最后导致将原先执行的线程写入的结果给覆盖了,在这种情况下时我们就可以称之为线程之间的不可见。

同样为了方便大家理解也画了一个流程图(注意序号):

那怎么解决线程之间的不可见?从我个人考虑的话解决的办法有两个,一个是锁机制,每次只让一个线程处理资源,另一个是volatile关键字,它能够保证线程之间的可见性和能够防止指令重排,但是要注意一点volatile不能保证线程的原子操作,所以跟锁有本质上的区别,并不能够解决线程之间的安全性问题。

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值