1 JVM内存模型

堆:

所有对象全部放在共享堆空间中

对象的属性在共享堆空间内

内存单字节对齐,short不变

栈:

每个线程都有独立的线程栈空间

线程栈只存基本类型和对象地址

栈内存4字节对齐,short变int

对象地址4字节,引用堆空间

方法中局部变量在线程栈空间内

方法参数在栈顶交叉,不拷贝

栈顶寄存,减少中间状态读取

PC指针记录当前执行位置

2 原子性

对象类型:

对象地址原子读写,线程安全

并发读不可变状态,线程安全

并发读写可变状态,非线程安全

基本类型:

int,char数值读写,线程安全

long,double高低位,非线程安全

i++等组合操作,非线程安全

3 可见性

final

初始化final字段确保可见性

volatile

读写volatile字段确保可见性

synchronized

同步块内读写字段确保可见性

happen before

遵守happen before次序可见性

4 可排序性

Happen Before 法则

程序次序法则

如果A一定在B之前发生,则happen before

监视器法则

对一个监视器的解锁一定发生在后续对同一监视器加锁之前

Volatie变量法则

写volatile变量一定发生在后续对它的读之前

线程启动法则

Thread.start一定发生在线程中的动作之前

线程终结法则

线程中的任何动作一定发生在括号中的动作之前(其他线程检测到这个线程已经终止,从Thread.join调用成功返回,Thread.isAlive()返回false)

中断法则

一个线程调用另一个线程的interrupt一定发生在另一线程发现中断之前。

终结法则

一个对象的构造函数结束一定发生在对象的finalizer之前

传递性

A发生在B之前,B发生在C之前,A一定发生在C之前。

5 系统内存

MESI协议:

Modified

本CPU写,则直接写到Cache,不产生总线事务;其它CPU写,则不涉及本CPU的Cache,其它CPU读,则本CPU需要把Cache line中的数据提供给它,而不是让它去读内存。

Exclusive

只有本CPU有该内存的Cache,而且和内存一致。 本CPU的写操作会导致转到Modified状态。

Shared

多个CPU都对该内存有Cache,而且内容一致。任何一个CPU写自己的这个Cache都必须通知其它的CPU。

Invalid

一旦Cache line进入这个状态,CPU读数据就必须发出总线事务,从内存读。

6 内存栅栏

读:

volatile int a, b; if(a == 1 && b == 2)

JIT通过load acquire依赖保证读顺序:

0x2000000001de819c:  adds r37=597,r36;;  ;...84112554

0x2000000001de81a0:  ld1.acq r38=[r37];;  ;...0b30014a a010

写:

volatile A a; a = new A();

JIT通过lock addl使CPU的cache line失效:

0x01a3de1d: movb $0x0,0x1104800(%esi);

0x01a3de24: lock addl $0x0,(%esp);

7 查看JIT编译结果

java -XX:+UnlockDiagnosticVMOptions -XX:PrintAssemblyOptions=hsdis-print-bytes -XX:CompileCommand=print,*AtomicInteger.incrementAndGet

8 对齐

LinkedTransferQueue

static final class PaddedAtomicReference extends AtomicReference {

Object p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, pa, pb, pc, pd, pe;

PaddedAtomicReference(T r) {

super(r);

}

}

16个地址的长度,刚好占满一个cache line的长度。

确保两个引用,不在同一cache line上,防止多锁竞争。

9 引用

private Channel channel;

public void setChannel (Channel channel ) {

this.channel = channel;

}

public void run() {

Channel channel = this.channel; // localed reference

if (channel != null && channel.isConnected()) {

// do something …

}

}

public void check() {

if (channel != channel)

throw new Error("check error!");

}

10 单例

11 多锁

12 计数

13 缓存

14 线程安全策略

不可变类

如果一个类初始化后,所有属性和类都是final不可变的,则它是线程安全,不需要任何同步,活性高。

线程栈内使用

方法内局部变量使用

线程内参数传递

ThreadLocal持有

同步锁

synchronized的代码串行执行,线程安全,但活性低。

volatile变量锁外双重检测(JDK1.5+),降低锁竞争。

读写条件分离,锁粒度分级,排序锁。

CAS (CompreAndSet)

循环设新值,如果旧值变化,则重设,乐观并发。

15 习惯

敲每个点号时,考虑:

会不会出现空指针?

有没有异常抛出?

是不是在热点区域?

在哪个线程执行?

有没有并发锁间隙?

会不会并发修改不可见?

转自梁飞的PPT

下载地址:链接:https://pan.baidu.com/s/1qf7tidbw-eDKm1w35BfMCQ  密码:b43z

java并发编程 博客_JAVA并发编程常识相关推荐

  1. java聊天室 博客_java网络聊天室

    功能简述: 1.可以多用户登陆聊天室,用户可以选择私聊或者对所有人聊天.(这里时间关系仅实现群聊,私聊只要将私聊消息和群聊消息封装开来即可实现) 2.有人登陆聊天室时由系统通知所有在线用户,并刷新在线 ...

  2. java 对象池 博客_Java对象池技术的原理及其实现的小结

    一起学习 Java对象的生命周期大致包括三个阶段:对象的创建,对象的使用,对象的清除.因此,对象的生命周期长度可用如下的表达式表示:T = T1 T2 T3.其中T1表示对象的创建时间,T2表示对象的 ...

  3. linux 编程博客,Linux系统编程博客参考

    Jquery中的日历插件 这个插件很简单:只需要在HTML代码中引入插件如下,CLASS名和click事件函数固定! ... Apache Solr 访问权限控制 Current state of a ...

  4. java用正则表达式判断字符串中是否仅包含英文字母、数字和汉字_灵思致远Leansmall的博客-CSDN博客_java判断字符串只包含数字字母

    import java.util.regex.Matcher; import java.util.regex.Pattern;public class StrValidate {// 纯数字priva ...

  5. 敏捷软工结对编程博客

    敏捷软工结对编程博客 项目 内容 这个作业属于哪个课程 2022春季软件工程(罗杰 任健) 这个作业的要求在哪里 结对编程项目-最长英语单词链 我在这个课程的目标是 学习软工的项目合作管理知识,提升软 ...

  6. 「BUAA SE Pair Programming Work」软工结对编程博客

    「BUAA SE Pair Programming Work」软工结对编程博客 Part 1 前言 项目 内容 这个作业属于哪个课程 2023年北航敏捷软件工程 这个作业的要求在哪里 结对项目-最长英 ...

  7. java课程设计 博客园_Java课程设计博客(团队)

    Java课程设计博客(团队) 1. 团队/项目名称 使用JAVA实现简易HTTP服务器 2. 团队成员 组长:林一心 组员:张杭镖 3. 项目git地址 4. 项目git提交记录截图 5. 项目功能架 ...

  8. Mblog 开源Java多人博客系统

    Mblog 开源Java多人博客系统 技术选型: JDK8 MySQL Spring-boot Spring-data-jpa Shiro Hibernate-search Ehcache Freem ...

  9. 毕业设计分享----基于Java的个性化博客空间的设计与实现

    一.大宇想说的话 大宇大学毕业已经四个月了,这四个月有懒惰的时候,有努力的时候.回首自己走过的路,只有毕业设计最能浓缩我的所学.我早就有这个打算:把自己的毕业设计与大家分享,但一直没有用行动落实.这个 ...

最新文章

  1. 怎么用迅雷下载python_我是如何使用python控制迅雷自动下载电影的?
  2. python之路-网络编程
  3. linux 实验2 进程创建,实验2Linux进程控制与通信
  4. uni-app 使用vue的语法+小程序的标签和API。
  5. python跑酷游戏源码_Phaser.js实现简单的跑酷游戏附源码下载
  6. 宝塔php gd库,宝塔面板安装 EasyImag – 一款最简单图床的安装体验
  7. uip UDPclient模式通信移植,当地port随机
  8. vue-cli搭建项目(笔记)
  9. MongnDB 主从复制
  10. VMware:虚拟化技术为运营商消除隐患
  11. 怎么把ide改成ahci_怎么改硬盘模式IDE,AHCI
  12. 安卓编程 Sqlite的入门编程
  13. Win10运行pip install image-similarity-measures失败的处理方式(GDAL和rasterio安装)
  14. 软件架构详解(附图)
  15. 【简易搭建个人博客】------- 基于BT面板的个人博客搭建
  16. 长周期光纤光栅 matlab,长周期光纤光栅传输谱的MATLAB仿真
  17. 数仓搭建——ODS层
  18. 笔记本wifi断流解决方法
  19. 博弈论 (入门)CSU2209 记忆化搜索
  20. elementUI的el-table的树形结构

热门文章

  1. 导入要素到要素类(C++)ArcEngine开发
  2. 地震勘探专业词汇(3)地震波动力学
  3. 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序
  4. 苹果手机内存怎么查_为什么苹果手机内存越用越小
  5. easyUI +datagirdview加载本地json的方式 笔记
  6. scala的运算符(四)
  7. 第三只眼使用局域网版本还是网络版好_让汽车的“第三只眼”更聪明更安全
  8. c语言里凤霞答案,C语言中循环结构的教学方法研究
  9. c语言学习-对一个百分制的成绩给出相应的等级(如90分以上A,80分以上B等
  10. ASP.NET MVC中的安全性