多线程高并发

线程可见性:

  1. 线程和cpu核心一对一
    运行的时候,会从主存读取到cpu寄存器中,也就是线程本地缓存(区别于threadlocalthreadlocal而是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据,可以不恰当的比喻为map),运行时在线程本地缓存读写修改数据。
    这样会出现两个线程修改一个数据可能不同步,使用volatile可以解决这个问题
    volatile维持线程的可见性,立刻同步多线程数据缓存
  2. 怎么理解超线程,双核四线程?
    cpu中一个计算单元对应两组数据寄存器,就叫做超线程
    双核四线程就是2个cpu,在每个cpu内部有一个计算单元,每个计算单元都对应两组数据寄存器,这样就是双核四线程;
  3. CPU的构成
image.png

因为寄存器速度和主存差距较大,所以cpu有三级缓存


image.png

三级缓存L3有两个CPU核共享(多核共享),二级缓存L2和一级缓存L1在一个CPU核中;
当需要读取数据x到寄存器中进行计算,会依次去L1,L2,L3中读取,如果没有,从主存中读出x缓存到L1,L2,L3中,下次可以直接从缓存中快速找到。
在程序加载的时候,或者缓存没有数据的时候,数据缓存是一块一块从主存加载到缓存中,回加载比较多的数据,这一块就叫cache line,一般是64字节大小(和cpu数据总线有一定关系);


image.png

缓存一致性协议(intel-mesi msi mosi等)保持多颗CPU用到同一块(cache line)数据的一致性,会导致互相同步;

线程有序性

cpu级别,汇编级别指令可能会重排序(不影响最后结果的前提下),原因是为了提高效率;

image.png

乱序存在的条件:

  1. as-if-serial
  2. 不影响单线程的最终一致性

并发

lock 临界区 悲观锁 重量级锁
自旋锁 乐观锁 轻量级锁

image.png
  • cas 的ABA问题
    对象引用的ABA问题,可能导致引用对象变了,版本号和时间戳可以解决ABA问题
  • cas操作本身的原子性保障

你可能感兴趣的:(多线程高并发)