0%

中期对并发的整理总结

2018年5月4日 上午9:19

  1. 我一直想尝试把并发的知识有一个简单的认识,做个总结。

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

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


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

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

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

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