广告服务
广州千锋教育Java学习分享
发布时间:2017-11-17 17:25:12 产品编号:GY-5-175882459  分享
价格:未填
发货:3天内
信息标签:广州千锋教育Java学习分享,供应,商务服务,广告服务

点击这里进行电话呼叫
点击这里QQ咨询
联系时一定要说在【贸易商务资源网】看到的将给您优惠!如果您也想和该公司一样在网站发信息有好排名,点击立即免费注册,发布产品推广
  

广州千锋教育Java学习分享

Java内存模型是围绕着并发编程中原子性、可见性、有序性这三个特征来建立的,那我们依次看一下这三个特征:

原子性(Atomicity

原子性是指一个操作不能被打断,要么全部执行完毕,要么不执行。在这点上有点类似于事务操作,要么全部执行成功,要么回退到执行该操作之前的状态。

基本类型数据的访问大都是原子操作,long double类型的变量是64位,但是在32JVM中,32位的JVM会将64位数据的读写操作分为232位的读写操作来进行,这就导致了longdouble类型的变量在32位虚拟机中是非原子操作,数据有可能会被破坏,也就意味着多个线程在并发访问的时候是线程非安全的。

可见性

一个线程对共享变量做了修改之后,其他的线程立即能够看到(感知到)该变量这种修改(变化)。

Java内存模型是通过将在工作内存中的变量修改后的值同步到主内存,在读取变量前从主内存刷新**值到工作内存中,这种依赖主内存的方式来实现可见性的。

无论是普通变量还是volatile变量都是如此,区别在于:volatile的特殊规则保证了volatile变量值修改后的新值立刻同步到主内存,每次使用volatile变量前立即从主内存中刷新,因此volatile保证了多线程之间的操作变量的可见性,而普通变量则不能保证这一点。

除了volatile关键字能实现可见性之外,还有synchronized,Lockfinal也是可以的。

使用synchronized关键字,在同步方法/同步块开始时(Monitor Enter,使用共享变量时会从主内存中刷新变量值到工作内存中(即从主内存中读取**值到线程私有的工作内存中),在同步方法/同步块结束时(Monitor Exit),会将工作内存中的变量值同步到主内存中去(即将线程私有的工作内存中的值写入到主内存进行同步)。

使用Lock接口的**常用的实现ReentrantLock(重入锁)来实现可见性:当我们在方法的开始位置执行lock.lock()方法,这和synchronized开始位置(Monitor Enter)有相同的语义,即使用共享变量时会从主内存中刷新变量值到工作内存中(即从主内存中读取**值到线程私有的工作内存中),在方法的**后finally块里执行lock.unlock()方法,和synchronized结束位置(Monitor Exit)有相同的语义,即会将工作内存中的变量值同步到主内存中去(即将线程私有的工作内存中的值写入到主内存进行同步)。

final关键字的可见性是指:被final修饰的变量,在构造函数数一旦初始化完成,并且在构造函数中并没有把“this”的引用传递出去(“this”引用逃逸是很危险的,其他的线程很可能通过该引用访问到只“初始化一半”的对象),那么其他线程就可以看到final变量的值。

有序性

对于一个线程的代码而言,我们总是以为代码的执行是从前往后的,依次执行的。这么说不能说完全不对,在单线程程序里,确实会这样执行;但是在多线程并发时,程序的执行就有可能出现乱序。用一句话可以总结为:在本线程内观察,操作都是有序的;如果在一个线程中观察另外一个线程,所有的操作都是无序的。前半句是指“线程内表现为串行语义(WithIn Thread As-if-Serial Semantics)”,后半句是指“指令重排”现象和“工作内存和主内存同步延迟”现象。

Java提供了两个关键字volatilesynchronized来保证多线程之间操作的有序性,volatile关键字本身通过加入内存屏障来禁止指令的重排序,而synchronized关键字通过一个变量在同一时间只允许有一个线程对其进行加锁的规则来实现,在单线程程序中,不会发生“指令重排”和“工作内存和主内存同步延迟”现象,只在多线程程序中出现。

Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的。Java内存模型的主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取出变量这样的底层细节。更多Java的学习内容欢迎大家加入千锋大家庭一起交流学习。

千锋教育:http://www.mobiletrain.org/

千锋广州校区:http://gz.qfedu.com/?pinzhuan=biaoti

广州校区地址:广州市天河区元岗路310号智汇park创意园E5

培训咨询专线:020-22119207 400-186-9990

    QQ  : 1660794050

面授课程:全栈HTML5+培训、JavaEE+云数据培训、Android课程培训、iOS课程培训

 

 

 

 

联系方式
公司: 北京千锋互联科技有限公司
状态:离线 发送信件
姓名:李老师(先生)
电话:400-186-9990
地区:北京-海淀区
地址:北京市海淀区宝盛北里西区28号天丰利商城4层
QQ:2530904216
商铺:http://m.ceoie.com/imissyou159/
去 北京千锋互联科技有限公司怎么走?上图中的红点是 北京千锋互联科技有限公司在海淀区的具体位置标注,操作左上角地图工具可以放大缩小哦。
相关信息
[广告服务] 推荐供应
最新发布信息
点击分享到微信、朋友圈、QQ...
字母索引:  A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z

首页 | 公司 | 求购 | 供应 | 商城 | 招商 | 展会 | 行情 | 品牌 | 产品

联系我们 | 刷新 | 返回顶部

©2004-2024  贸易商务资源网(ceoie.com)  版权所有