java 同步操作降低效率解惑


      相信在读者刚接触Java的时候,都曾经学习到线程安全的会影响效率,例如 
HashTable < HashMap,StringBuffered < StringBuilder , Vector <  ArrayList ,当然原因也非常简单,因为这些类方法当中存在同步(synchronized)操作 


      要说明为什么同步操作会影响效率,首先就要了解Java当中的多线程原理,Java当中多个线程之间是不能互相传递数据通信的,多线程之间的通信只能通过共享变量来完成.而JVM当中存在一个所有线程都共享的内存区域,称为主存,当我们new一个对象的时候,该对象将会放置到JVM主存当中,而每个线程他们都有各自独立的工作空间,在多线程环境下,每个线程操作某个对象时,会从主存当中获取对象然后生成副本放置在各自的工作空间当中. 


 


      当操作对象时,线程首先会检查工作区间是否拥有对象的副本,若然没有,则读取主存生成副本,若拥有副本则直接对读取副本,然后对对象进行修改,然后同步到主存当中,由于多线程的执行顺序是不能确定的,取决于CPU,所以可能出现两条线程同时在主存获取到副本,对各自的副本进行修改先后提交导致错误数据出现的情况,而解决这个问题就要使用synchronized同步机制. 


 


      在使用同步时,我们都知道只有一条线程能进入到已同步的逻辑当中,那为什么会影响效率?其实是一个很简单的道理.在不同步的状态下线程同副本中获取,就好比一个在旁边顺手拿东西,而在同步下,需要到JVM中的主存来获取,好比一个攀山涉水的过程,因为需要从主存当中重新获取主存中对象最新的信息,然后对其修改,提交回主存当中,而且申请锁是要会占用系统资源,所以这才是导致同步操作效率低的情况发生. 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值