您好、欢迎来到现金彩票网!
当前位置:2019欢乐棋牌 > 执行开销 >

并发编程艺术(一)

发布时间:2019-07-27 04:27 来源:未知 编辑:admin

  。Lock前缀指令导致在执行指令期间,声明处理器的LOCK#信号。在多处理器环境中,LOCK#信号确保在声明该信号期间,处理器可以独占任何共享内存  。但是,在最近的处理器里,LOCK#信号一般不锁总线,而是锁缓存,毕竟锁总线开销的比较大。对于Intel486和Pentium处理器,在锁操作时,总是在总线上声明LOCK#信号。但在P6和目前的处理器中,如果访问的内存区域已经缓存在处理器内部,则不会声明LOCK#信号。相反,它会锁定这块内存区

  域的缓存并回写到内存,并使用缓存一致性机制来确保修改的原子性,此操作被称为“缓存锁定”,缓存一致性机制会阻止同时修改由两个以上处理器缓存的内存区域数据。

  2)一个处理器的缓存回写到内存会导致其他处理器的缓存无效。处理器使用嗅探技术保证它的内部缓存、系统内存和其他处理器的缓存的数据在总线上保持一致。嗅探发现缓存中对应的地址被修改,就将其在缓存中置为无效状态

  从JVM规范中可以看到Synchonized在JVM里的实现原理,JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter和monitorexit指令实现的,而方法同步是使用另外一种方式实现的,细节在JVM规范里并没有详细说明。但是,方法的同步同样可以使用这两个指令来实现。monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束处和异常处,JVM要保证每个monitorenter必须有对应的monitorexit与之配对。任何对象都有一个monitor与之关联,当且一个monitor被持有后,它将处于锁定状态。线程执行到monitorenter指令时,将会尝试获取对象所对应的monitor的所有权,即尝试获得对象的锁。

  偏向锁使用了一种等到竞争出现才释放锁的机制,所以当其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁。偏向锁的撤销,需要等待全局安全点(在这个时间点上没有正在执行的字节码)。它会首先暂停拥有偏向锁的线程,然后检查持有偏向锁的线程是否活着,如果线程不处于活动状态,则将对象头设置成无锁状态;如果线程仍然活着,拥有偏向锁的栈会被执行,遍历偏向对象的锁记录,栈中的锁记录和对象头的Mark Word要么重新偏向于其他线程,要么恢复到无锁或者标记对象不适合作为偏向锁,最后唤醒暂停的线程。

  线程在执行同步块之前,JVM会先在当前线程的栈桢中创建用于存储锁记录的空间,并将对象头中的Mark Word复制到锁记录中,官方称为Displaced Mark Word。然后线程尝试使用CAS将对象头中的Mark Word替换为指向锁记录的指针。如果成功,当前线程获得锁,如果失败,表示其他线程竞争锁,当前线程便尝试使用自旋来获取锁。

  轻量级解锁时,会使用原子的CAS操作将Displaced Mark Word替换回到对象头,如果成功,则表示没有竞争发生。如果失败,表示当前锁存在竞争,锁就会膨胀成重量级锁。

  如果多个处理器同时对共享变量进行读改写操作(i++就是经典的读改写操作),那么共享变量就会被多个处理器同时进行操作,这样读改写操作就不是原子的,操作完之后共享变量的值会和期望的不一致。总线锁就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存。

  第二个机制是通过缓存锁定来保证原子性。在同一时刻,我们只需保证对某个内存地址的操作是原子性即可,但总线锁定把CPU和内存之间的通信锁住了,这使得锁定期间,其他处理器不能操作其他内存地址的数据,所以总线锁定的开销比较大,目前处理器在某些场合下使用缓存锁定代替总线锁定来进行优化。

  所谓“缓存锁定”是指内存区域如果被缓存在处理器的缓存行中,并且在Lock操作期间被锁定,那么当它执行锁操作回写到内存时,处理器不在总线上声

  明LOCK#信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会阻止同时修改由两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行的数据时,会使缓存行无效

  第一种情况是:当操作的数据不能被缓存在处理器内部,或操作的数据跨多个缓存行(cache line)时,则处理器会调用总线锁定。

  第二种情况是:有些处理器不支持缓存锁定。对于Intel 486和Pentium处理器,就算锁定的内存区域在处理器的缓存行中也会调用总线锁定。

  1)ABA问题。因为CAS需要在操作值的时候,检查值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。ABA问题的解决思路就是使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号加1,那么A→B→A就会变成1A→2B→3A

  2)循环时间长开销大。自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。如果JVM能支持处理器提供的pause指令,那么效率会有一定的提升。pause指令有两个作用:第一,它可以延迟流水线执行指令(de-pipeline),使CPU不会消耗过多的执行资源,延迟的时间取决于具体实现的版本,在一些处理器上延迟时间是零;第二,它可以避免在退出循环的时候因内存顺序冲突(Memory Order Violation)而引起CPU流水线被清空(CPU Pipeline Flush),从而提高CPU的执行效率。

  3)CAS只能保证一个共享变量的原子性(1.5以后支持将多个共享变量组合成一个共享变量,例:xy=1a;x=1,y=a)

  1.并发编程概念及问题上下文切换:任务从保存到再加载的过程就是一次从上下文的切换 串行与并发的耗时比较:当并发执行超过百万次时,速度比串行慢,因为线程有创建和上下文切换的开销 上下文切换次数和时长:每...博文来自:m0_37834471的博客

  Java并发编程艺术Java并发编程艺术Java并发编程艺术Java并发编程艺术Java并发编程艺术

  本书结合JDK源码介绍了Java并发框架,线程池的实现原理,深入到JVM,CPU层面来进行讲解,帮助读者从底层看并发技术。

  JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。

  封面内容简介并发编程领域的扛鼎之作,作者是阿里和1号店的资深Java技术专家,对并发编程有非常深入的研究,《Java并发编程的艺术》是他们多年一线开发经验的结晶。本书的部分内容在出版早期发表在Java...博文来自:一个优秀的废人

  一,并发底层实现1,volatitle的应用2,synchronized的实现原理3,原子操作的原理二,java的内存模型1,抽象结构2,happens-before简介3,并发编程的模型的关键问题4...博文来自:u010937237的博客

  第一章 介绍Java并发编程的挑战,向读者说明进入并发编程的世界可能会遇到哪些问题,以及如何解决。第二章 介绍Java并发编程的底层实现原理,介绍在CPU和JVM这个层面是如何帮助Java实现并发编程...博文来自:csdn_kenneth的博客

  1.并发编程的两个关键问题并发是让多个线程同时执行,若线程之间是独立的,那并发实现起来很简单,各自执行各自的就行;但往往多条线程之间需要共享数据,此时在并发编程过程中就不可避免要考虑两个问题:通信与同...博文来自:大闲人柴毛毛

  参考博客:理解volatile特性的一个好方法是把对volatile变量的...博文来自:的博客

  ChapterOne并发编程的挑战 1.并发编程的目的是为了让程序更快速的运行,但是并不是启用更多的线程就能让程序最大限度的并发执行。2.进行多线程并发编程时,会遇到许多挑战,列举三个:上下文切换、死...博文来自:四点钟的天空,我的梦

  内容主要围绕两个方面:使用,通过示例演示这些组件的使用方法以及详细介绍与锁相关的API;实现,通过分析源码来剖析实现细节,因为理解实现的细节方能更加得心应手且正确地使用这些组件。Lock接口锁是用来控...博文来自:的博客

  《Java并发编程的艺术》PDF高清完整版-免费下载《Java并发编程的艺术》PDF高清完整版-免费下载下载地址:网盘下载备用地址:网盘下载内容简介并发编程领域的扛鼎之作,作者是阿里和1号店的资深...博文来自:weixin_34376986的博客

  为什么要使用多线程简单来讲,就是为了程序运行的更快1、发挥多处理器的强大能力(见)现在,多处理器系统正日益盛行,...博文来自:jay_boolean的博客

  最近在读Java并发编程的艺术(阿里专家方腾飞),对java并发编程有了更深的了解,特此开篇记录阅读每章后的感想,用自己的话来描述。了解概念 上下文切换:比如有两个线程,CPU通过给每个线程分配CPU...博文来自:琅天溪的博客

  并发Map分析位码shift默认值是28,对hash值右移28位,取高四位,获得segments位置,掩码mask默认值16-1,作一个与值,不知道有何用处,两个都是不可修改,初始值和并发度有关,一旦...博文来自:u012557298的专栏

  前言  在看这本书之前,看过了《java多线程编程的核心技术》书中列出了一些java多线程会遇到的基本的类和方法,sychronized,lock,executor等的基本使用方法,为看这本书打了一些...博文来自:岁月静好,做自己。

  1.并发编程的两个关键问题并发是让多个线程同时履行,若线程之间是独立的,那并发实现起来很简单,各自履行各自的就行;但常常多条线程之间需要同享数据,此时在并发编程进程中就不可避免要斟酌两个问题:通讯与同...博文来自:V_1920的博客

  线级线程的状态:NEW:初始状态,线程被创建,还未执行start()RUNNABLE:运行状态,包括运行态和就绪态BLOCKED:阻塞状态,表示线程阻塞于锁,阻塞在线程进入synchr...博文来自:a_he_gong_zhu的专栏

  [b]上下文切换[/b]线程执行时需要分配CPU资源,CPU按照时间片分给线程执行,在线程时间片用完的情况下,需要保存现场,将执行权转让给其他线程。当该线程重新有机会执行时,需要加载之前的现场信息,然...博文来自:juzicha的专栏

  Executor两级调度模型在HotSpot虚拟机中,Java中的线程将会被一一映射为操作系统的线程。在Java虚拟机层面,用户将多个任务提交给Executor框架,Executor负责分配线程执行它...

  《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时通过实例介...

  Java并发编程的艺术 作者:方腾飞 魏鹏 程晓明著 丛书名:Java核心技术系列 出版日期 :2015-07-25 ISBN:978-7-111-50824-3 第1章介绍Java并发编程的挑战,向读者说明进入并发编程的世界可能会遇到...

  一概述 本文属于《java并发编程的艺术》读书笔记系列,第四章java并发的基础。4.1线程简介这里作者介绍了线程的相关知识,如线程、优先级,状态,daemon线程,线程的启动和停止。这里可以参照之前...

  并发编程的挑战1上下文切换。cpu通过时间片分配算法来执行任务,从一个任务切换到另一个任务时会保留上个任务的状态。多线程切换上下文开销大,不一定比单线程快。减少上下文切换的方法1无锁并发,不同线程处理...

  开篇语想写这样一个东西很久了,在慕课网上学完某老师的课程(避免打广告的嫌疑就不贴出来了,感兴趣的同学可以去慕课网上去搜来看看,是个付费课程)之后就觉得应该有这样的一个学习总结的东西来,后来因为懒又有其...

  AQS理解之五—并发编程中AQS的理解首先看下uml类图:AbstractOwnableSynchronizer这个类定义是提供一个创建锁的基础,设置一个排它线程,帮助控制和监控访问。先看下Abstr...

  Unix设计的统一思想:一切皆文件。Linux是一个采取了Unix的设计思想,初始行为表现与Unix相同的操作系统,但Linux中的源码并未有任何出自Unix。Linux符合一切皆文件的思想,其中读写...

  JavaScript中的经典书籍,入门,进阶皆可。讲述的是JavaScript基础知识和DOM的知识。

  (The Art of Computer Programming)1-4卷-中文版

  “它本来是作为参考书撰写的,但有人发现每一卷可以饶有兴致地从头读到尾。一位中国的程序员甚至把他的阅读经历比做读诗。如果你认为你确实是一个好的程序员,读一读 Knuth 的《计算机程序设计艺术》吧,要 是你真的把它读通了,你就可以给我递简历...

  无论你是开发人员还是DBA,要创建和管理稳定、高质量的Oracle系统,归根结底都需要理解Oracle数据库的体系结构。

  这是 JavaScript_DOM编程艺术第二版(中文) 为 pdf文件 因为文件太大 , 给的是云盘下载地址

http://nicolashsiung.com/zhixingkaixiao/270.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有