Java 并发笔记

减少上下文切换(上下文切换:CPU在多个线程间切换执行)途径:

  1. 无锁并发编程:将数据的ID按照hash算法取模分段,不用线程处理不同段的数据;
  2. CAS算法 ::Compare and Swap 原理是CPU的cas指令, 通过缓存锁,保证操作的原子性,
    例如 i++, 局限是只能保持一个变量的操作原子性
    缓存锁与总线锁相比,优势在于,总线锁将CPU和内存的通道锁住,导致其他其他处理器无法处理内存数据,而所谓“缓存锁定”,就是如果缓存在处理器缓存行中内存区域在LOCK操作期间被锁定,当它执行锁操作回写内存时,处理器不在总线上声言LOCK#信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会阻止同时修改被两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行的数据时会起缓存行无效
    在i++操作中,当CPU1修改缓存行中的i时使用缓存锁定,那么CPU2就不能同时缓存了i的缓存行。

  3. 使用最少线程

  4. 协程。单线程中实现多任务的调度,并维持多个任务的切换

Java的锁
由低到高: 无锁,偏向锁,轻量级锁,重量级锁

占有锁对象的:通过CAS操作将ThreadId ,放入 对象的对象头的 Mark Word的位置

偏向锁:如果出现锁竞争,先暂停有锁线程,检查这个线程是否活跃,

volatile变量的内存读写:

  • 线程A写一个volatile变量,实质上是给接下来要读这个变量的线程发了消息
  • 线程B读一个volatile变量,实质上是接受了之前某线程发出的消息
  • 线程A写一个volatile变量,线程B又读了,实质上就是线程A通过主内存向线程B发送了一个消息

并发工具类

等待多线程完成 :CountDownLatch
最简单的方法是 Thread 的join方法, 用于让当前线程等待join线程结束。
而使用CountDwoLatch,构造方法需要传一个int值 ,表示需等待N个点, 提供await()方法,阻塞等待,
如果不阻塞,可用await(long time,TimeUnit unit);

你可能感兴趣的:(笔记)