`
- 浏览:
216515 次
- 性别:
- 来自:
广州
-
相信在读者刚接触Java的时候,都曾经学习到线程安全的会影响效率,例如
HashTable < HashMap,StringBuffered < StringBuilder , Vector < ArrayList ,当然原因也非常简单,因为这些类方法当中存在同步(synchronized)操作
要说明为什么同步操作会影响效率,首先就要了解Java当中的多线程原理,Java当中多个线程之间是不能互相传递数据通信的,多线程之间的通信只能通过共享变量来完成.而JVM当中存在一个所有线程都共享的内存区域,称为主存,当我们new一个对象的时候,该对象将会放置到JVM主存当中,而每个线程他们都有各自独立的工作空间,在多线程环境下,每个线程操作某个对象时,会从主存当中获取对象然后生成副本放置在各自的工作空间当中.
当操作对象时,线程首先会检查工作区间是否拥有对象的副本,若然没有,则读取主存生成副本,若拥有副本则直接对读取副本,然后对对象进行修改,然后同步到主存当中,由于多线程的执行顺序是不能确定的,取决于CPU,所以可能出现两条线程同时在主存获取到副本,对各自的副本进行修改先后提交导致错误数据出现的情况,而解决这个问题就要使用synchronized同步机制.
在使用同步时,我们都知道只有一条线程能进入到已同步的逻辑当中,那为什么会影响效率?其实是一个很简单的道理.在不同步的状态下线程同副本中获取,就好比一个在旁边顺手拿东西,而在同步下,需要到JVM中的主存来获取,好比一个攀山涉水的过程,因为需要从主存当中重新获取主存中对象最新的信息,然后对其修改,提交回主存当中,而且申请锁是要会占用系统资源,所以这才是导致同步操作效率低的情况发生.
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
java解惑java解惑java解惑java解惑java解惑java解惑
Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑
解惑SQL
Java解惑.pdf Java解惑.pdf Java解惑.pdf Java解惑.pdf
JAVA解惑.pdf JAVA解惑.pdf JAVA解惑.pdf
《Java解惑》《Java解惑》《Java解惑》《Java解惑》《Java解惑》《Java解惑》
Java解惑中文版 Java解惑 java健壮程序
SQL解惑(第2版)
EXCEL函数公式解惑专集EXCEL函数公式解惑专集
扫描完整版 解惑大数据 解惑大数据 解惑大数据 解惑大数据
IT 学生解惑经典指导书 IT 学生解惑经典指导书 IT 学生解惑经典指导书 IT 学生解惑经典指导书 IT 学生解惑经典指导书 IT 学生解惑经典指导书 IT 学生解惑经典指导书 IT 学生解惑经典指导书
C语言解惑中文版.pdf 扫描版
IT学生解惑真经
IT 学生解惑真经
"java解惑" PDF版本
JAVA解惑,你面包括一些java经典的问题。
C语言解惑。经典C语言解惑
JAVA面试题解惑系列合集 JAVA面试题解惑系列合集 JAVA面试题解惑系列合集
这是一本关于即将进入IT界的大学生,写的一本书,用来解惑职场将出现的问题