java并发编程常识

java并发编程常识

ID:9818525

大小:661.44 KB

页数:19页

时间:2018-05-10

java并发编程常识_第1页
java并发编程常识_第2页
java并发编程常识_第3页
java并发编程常识_第4页
java并发编程常识_第5页
资源描述:

《java并发编程常识》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、JAVA并发编程常识虚极(梁飞)JVM内存模型•堆:线程栈1线程栈2–所有对象全部放在共享堆空间中PC数值–对象的属性在共享堆空间内方法2地址•堆内存单字节对齐,short不变参数Long低方法1Long高•栈:–每个线程都有独立的线程栈空间–线程栈只存基本类型和对象地址•栈内存4字节对齐,short变int对象数值•对象地址4字节,引用堆空间–方法中局部变量在线程栈空间内堆空间•局部变量不会竞争,线程安全•方法参数在栈顶交叉,不拷贝-Xss1M栈大小-Xmx1G堆大小•栈顶寄存,减少中间状态读取–PC指针记录当前执行位置原

2、子性•对象类型:–对象地址原子读写,线程安全–并发读不可变状态,线程安全–并发读写可变状态,非线程线程•基本类型:–int,char数值读写,线程安全–long,double高低位,非线程安全–i++等组合操作,非线程安全可见性•final–初始化final字段确保可见性•volatile–读写volatile字段确保可见性•synchronized–同步块内读写字段确保可见性•happenbefore–遵守happenbefore次序可见性可排序性•HappenBefore法则–程序次序法则•如果A一定在B之前发生,则ha

3、ppenbefore,–监视器法则•对一个监视器的解锁一定发生在后续对同一监视器加锁之前–Volatie变量法则•写volatile变量一定发生在后续对它的读之前–线程启动法则•Thread.start一定发生在线程中的动作之前–线程终结法则•线程中的任何动作一定发生在括号中的动作之前(其他线程检测到这个线程已经终止,从Thread.join调用成功返回,Thread.isAlive()返回false)–中断法则•一个线程调用另一个线程的interrupt一定发生在另一线程发现中断之前。–终结法则•一个对象的构造函数结束一定

4、发生在对象的finalizer之前–传递性•A发生在B之前,B发生在C之前,A一定发生在C之前。系统内存•MESI协议:cacheline(64bytes)–ModifiedL1•本CPU写,则直接写到Cache,不产CPU1CPU2L2生总线事务;其它CPU写,则不涉及本CPU的Cache,其它CPU读,则L3本CPU需要把Cacheline中的数据提供给它,而不是让它去读内存。lockpin–Exclusive前端总线•只有本CPU有该内存的Cache,而且和内存一致。本CPU的写操作会导致转到Modified状态。–S

5、haredDMA内存控制器•多个CPU都对该内存有Cache,而且内容一致。任何一个CPU写自己的这个Cache都必须通知其它的CPU。–Invalid内存总线•一旦Cacheline进入这个状态,CPU读数据就必须发出总线事务,从内存读。MEM内存内存栅栏•读:–volatileinta,b;if(a==1&&b==2)–JIT通过loadacquire依赖保证读顺序:•0x2000000001de819c:addsr37=597,r36;;;...84112554•0x2000000001de81a0:ld1.acqr3

6、8=[r37];;;...0b30014aa010•写:–volatileAa;a=newA();–JIT通过lockaddl使CPU的cacheline失效:•0x01a3de1d:movb$0x0,0x1104800(%esi);•0x01a3de24:lockaddl$0x0,(%esp);查看JIT编译结果•java-XX:+UnlockDiagnosticVMOptions-XX:PrintAssemblyOptions=hsdis-print-bytes-XX:CompileCommand=print,*Atom

7、icInteger.incrementAndGet对齐LinkedTransferQueuestaticfinalclassPaddedAtomicReferenceextendsAtomicReference{Objectp0,p1,p2,p3,p4,p5,p6,p7,p8,p9,pa,pb,pc,pd,pe;PaddedAtomicReference(Tr){super(r);}}16个地址的长度,刚好占满一个cacheline的长度。确保两个引用,不在同一cacheline上,防止多锁竞争。引用privat

8、eChannelchannel;publicvoidsetChannel(Channelchannel){this.channel=channel;}publicvoidrun(){Channelchannel=this.channel;//localedreferenceif(chann

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。