`
ray_yui
  • 浏览: 216515 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

同步操作降低效率解惑

    博客分类:
  • Java
阅读更多

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


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





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





      在使用同步时,我们都知道只有一条线程能进入到已同步的逻辑当中,那为什么会影响效率?其实是一个很简单的道理.在不同步的状态下线程同副本中获取,就好比一个在旁边顺手拿东西,而在同步下,需要到JVM中的主存来获取,好比一个攀山涉水的过程,因为需要从主存当中重新获取主存中对象最新的信息,然后对其修改,提交回主存当中,而且申请锁是要会占用系统资源,所以这才是导致同步操作效率低的情况发生.
10
1
分享到:
评论
4 楼 793059909 2014-07-01  
JVM当中存在一个所有线程都共享的内存区域,称为主存,当我们new一个对象的时候,该对象将会放置到JVM主存当中,而每个线程他们都有各自独立的工作空间,在多线程环境下,每个线程操作某个对象时,会从主存当中获取对象然后生成副本放置在各自的工作空间当中.





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

主存应该是堆
3 楼 maimode 2014-07-01  
还想知道更多细节
2 楼 桃花源记 2014-07-01  
1.既然必须要用多线程就不能不考虑同步;
2.既然考虑到同步问题,最好还是用这些HashTable、StringBuffered、Vector、currenthashmap等这些已经实现同步的类,要比加锁判断快很多很多;
3.同步操作会影响效率,也就是相对来说的,还是比单线程快很多
1 楼 avrilzkq 2014-06-30  
相当有道理

相关推荐

Global site tag (gtag.js) - Google Analytics