2018年5月4日 上午9:19
我一直想尝试把并发的知识有一个简单的认识,做个总结。
- 我们可以想象一下,为啥硬件和java的创造者要创建出线程不安全的情况
- 对于硬件来说,就像缓存的出现一样,他是被现实所打败
- 对于java语言来说,
- 整体上去看,他提供了各种底层的准则去保证一定的顺序性,但是远远是不够的,并不能保证并发的安全。
- 并且,他还设计出了类似指令重排,这样就会更加引起线程的不安全
- 他这么做的原因是在速度和线程安全的一种相互的博弈
- 为了弥补缺陷,他设计出个各种关键字让程序员自己实现线程安全,
- 同时他也提供了自己的一些线程安全和线程不安全的类,stringBuilder等,是因为线程安全会消耗一定的时间,这能让程序员更加灵活的选择。
首先提出了两个问题:
- 线程不安全的原因

- 如何让线程安全的方法 线程安全的策略
- 线程不安全的原因
发现:三性(原子性、可见性、有序性)其实就是回答了这两个问题。下面我从java、硬件的设计者角度去尝试理解并解决这两个问题。



【JVM】:规定了线程基本的有序性规则,可以理解成java语言默认的东西。

【JMM】:规定了那些“最废话”的规则,是人的都知道的。

- 或者换种说法:JMM就是为了规定哪些最废话的规则而产生的
- 他定义的是一个基本的框架,这个框架本身就有很多的不足
- JMM管理JVM和内存之间的协同工作方式
- 本地内存的理解很关键:
- 是针对每个线程的
- 是抽象的概念,可以理解成主内存之外各种小的内存都可称之某个线程的本地内存
- 作用:其实就是主内存数据的副本
【 硬件】:
- cpu缓存局部性原理

- 缓存一致性原理:MESI
- 理解:因为要解决cpu和内存速度不匹配的问题,引入缓存之后而带来的本来内存中的一份数据 ,现在变成了多份,因为缓存中会出现对内存数据的拷贝和加工
- 这时候就需要一个准则来表明各个数据的状态,那么我们就可以根据数据的状态进行判断和处理,区分、处理各种情况。
- cpu缓存局部性原理