多线程状态下使用同步机制的本质原因

简述

在Java的学习中必然会遇到多线程和同步问题,对于初学者一般只会理解到相关api的使用,但是很少能够真正知道为什么要对多线程环境下的对象进行同步,接下来我就谈谈自己的一些理解。

JVM堆与JVM栈宏观室是分离的,而微观上则又相互联系,这种分配方式使得JVM堆中的内容可以被多个JVM栈共享(也可以理解为多个线程访问同一个或者多个对象)。这种共享的收益是很多的。一方面这种共享提供了一种有效的数据交互方式(如:内存共享),另一方面,JVM堆中的共享常量和缓存可以被所有JVM栈访问,节省了空间。

借此理解多线程机制

多线程为什么要采用同步机制,因为不同的线程有自己的栈,栈中可能引用了多个对象,而多个线程可能引用到了堆中的同一个或多个对象,而线程的栈内存当中的数据只是临时数据,最终都是要刷新到堆中的对象内存,这里的刷新并不是最终的状态一次性刷新,而是在程序执行的过程中随时刷新(肯定有固定的机制,暂不考虑),也许在一个线程中被应用对象中的某一个方法执行到一半的时候就将该对象的变量状态刷新到了堆的对象内存中,那么再从多线程角度来看,当多个线程对同一个对象中的同一个变量进行读写的时候,就会出现类似数据库中的并发问题,假设被引用对象中有一个变量SA=10,线程A读取到10,并且在栈中修改成了15但还没有刷新到堆中,线程B也读取到10,此时A刷新到堆中,则堆中被引用的变量的值变成了15,这个时候B将读取到的10修改为20,再次刷新到堆中,堆中被引用对象的变量SA值为20,这个时候A重新获取SA,发现不是15,而是20,显然出现了问题。针对上述问题,假设我们添加了同步机制,那么就可以很容易的解决。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值