Java并发编程实践..docxVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java并发编程实践.

对象的共享关键字synchronized不仅能实现原子性还能确保当一个线程修改了对象状态后,另一个线程就可以看到对象状态的变化(内存可见性)可见性重排序:在缺乏足够同步的多线程程序中,代码的执行顺序不会按照程序员写好的顺序进行。这是因为Java内存模型允许编译器、CPU对操作的执行顺序进行调整。失效数据在多线程程序中,get方法、set方法都需要进行同步。这是因为get方法在获取变量时可能会获得一个失效的值,这个失效的值就是之前某个线程设置的。虽然已经失效但这个值曾经是正确的。非原子的64位操作Java内存模型要求,非volatile类型的64位数值变量(double和long),JVM允许将64位的读操作和写操作分解为两个32位的操作。那么在多线程的环境中,如果要读取非volatile类型的double、隆就有可能会读取到某个值的高32位和另一个值的低32位组成的一个数值。但目前各种平台的商用虚拟机几乎都把64位数据的读写操作作为原子操作来对待。加锁与可见性加锁的含义不仅仅局限于互斥行为,还包括内存可见性。为了确保所有线程都能看到共享变量的必威体育精装版值,所有执行读操作或者写操作的线程都必须在同一个锁上同步。同步代码块的锁就是方法调用所在的对象,静态synchronized方法以Class对象作为锁。synchronized可以用于实例变量、对象引用、static方法、类名称字面常量。在某个对象实例内,synchronized aMethod(){} 可以防止多个线程同时访问这个对象其他的synchronized方法(这个对象还有其他的synchronized方法,如果其中一个线程访问了其中一个synchronized方法,那么其他线程将不能访问此对象另外的synchronized方法)。但不同的对象实例间的synchronized方法是相互独立的,也就是说其他线程照样可以访问相同类的另一个对象实例的synchronized方法。synchronized static aMethod(){}对这个类所有的静态synchronized方法都会起作用,但不会对非静态的synchronized起作用。这是因为static方法属于类方法,他属于这个Class(注意:这里的Class不是指Class的某个具体对象),那么static方法所获取到的锁就是调用这个方法的对象所属的类,而非static方法获取到的锁就是当前调用这个方法的对象了。除了在方法上用synchronized关键字外,也可以在方法内部的某个区块中用synchronized表示只对这个区块中的资源进行同步访问,例如synchronized(this){/**区块**/}的作用域就是当前对象。非static方法运行结果是:chunk对象与chunk1对象锁互不干扰。chunk19chunk对象引用结果与上面一样,也是chunk与chunk1互不干扰chunk19chunkstatic方法注意这段代码中的chunk与chunk1是互不干扰的,因为他们一个是static一个是非static方法。执行结果是:chunk19chunk这段代码中的chunk与chunk1就可以进行同步操作了。因为他们的锁是同一个锁,执行结果是:9chunkchunk1类名称字面常量让所有这个类下面的对象都同步的时候,也就是让所有这个类下面的对象共用同一把锁的时候,我们可以在区块中锁定类常量的方式进行。例如:通过锁定lock对象,我们可以实现对这个类所有对象的同步。切记synchronized锁定的是对象,对象不同就不会同步。例如:两个方法就不会同步一个锁定的是lock一个锁定的是类对象。volatile变量volatile是比synchronized更轻量级的同步机制。volatile变量有两种特性,一种是保证此变量对所有线程可见。但volatile变量对所有线程不是立即可见的,每次使用volatile变量时都会将变量值从主内存中取到线程内存里,所以volatile变量在各个线程中是一致的。但volatile变量的运算不能保证在并发的环境下仍然是安全的,这是因为Java里的运算不是原子操作。volatile的使用情况如下:运算结果不依赖于变量的当前值,或者能够确保只有单一线程修改变量的值变量不需要与其他的状态变量共同参与不变形约束例如:当需要检查某个状态标记以判断是否退出循环的时候可以考虑采用volatile,加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性。volatile的第二种特性是禁止指令重排序。Java内存模型对volatile变量的特殊规则如下:在线程工作内存中,每次使用volatile变量,都必须先从主内存刷新必威体育精装版的值,用于保证能及时看见其他线程对volati

文档评论(0)

bhzs + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档