https://segmentfault.com/a/1190000037600050

进程与线程

进程

  • 正在进行的程序,是系统资源分配的最小单位。有独立的内存空间,但切换开销大

线程

  • 系统任务调度的最小单位,每条线程就是一个任务。由于共享空间,因此需要进行线程间的通信

线程状态: NEW RUNNABLE BLOCKED WAITTING TIMED_WAITTING TERMINATED

TIMED_WAITTING : 等不下去了 自己从哪个线程来,回到哪个线程去

sleep 和 wait 区别:

sleep抱着锁睡觉
wait 释放锁

进程通信

  • 管道
  • 报文
  • socket
  • 信号量(信号)
  • 共享空间

线程通信

  • lock
  • 信号量
  • volatile
  • wait/notify

Synchronized

  • 自动挡的lock
  • 锁住的对象 (对象 类)

与lock的区别:

  • synchronized 是关键字 lock是类
  • synchronized 无法获取锁的状态
  • synchronized 自动释放 lock 手动释放
  • synchronized 非公平锁 可重入 lock 可调

精准唤醒

Contidion

顺序输出123

  1. package lock;
  2. import java.util.concurrent.locks.Condition;
  3. import java.util.concurrent.locks.Lock;
  4. import java.util.concurrent.locks.ReentrantLock;
  5. public class A {
  6. public static void main(String[] args) {
  7. D d = new D();
  8. new Thread(d::pA).start();
  9. new Thread(d::pB).start();
  10. new Thread(d::pC).start();
  11. }
  12. }
  13. class D {
  14. private Lock lock = new ReentrantLock();
  15. private Condition c1 = lock.newCondition();
  16. private Condition c2 = lock.newCondition();
  17. private Condition c3 = lock.newCondition();
  18. public int num = 1;
  19. public void pA() {
  20. lock.lock();
  21. try {
  22. while (num != 1) {
  23. c1.await(); //等待
  24. }
  25. num = 2;
  26. System.out.println("A ok");
  27. System.out.println(Thread.currentThread().getName() + "=> A...");
  28. c2.signal();
  29. } catch (InterruptedException e) {
  30. e.printStackTrace();
  31. } finally {
  32. lock.unlock();
  33. }
  34. }
  35. public void pB() {
  36. lock.lock();
  37. try {
  38. while (num != 2) {
  39. c2.await();
  40. }
  41. num = 3;
  42. System.out.println("B ok");
  43. System.out.println(Thread.currentThread().getName() + "=> B...");
  44. c3.signal();
  45. } catch (InterruptedException e) {
  46. e.printStackTrace();
  47. } finally {
  48. lock.unlock();
  49. }
  50. }
  51. public void pC() {
  52. lock.lock();
  53. try {
  54. while (num != 3) {
  55. c3.await();
  56. }
  57. num = 1;
  58. System.out.println("C ok");
  59. System.out.println(Thread.currentThread().getName() + "=> C...");
  60. c1.signal();
  61. } catch (InterruptedException e) {
  62. e.printStackTrace();
  63. } finally {
  64. lock.unlock();
  65. }
  66. }
  67. }

并发集合

  • ConcurrentHashMap
  • ConcurrentSkipListMap
  • ConcurrentSkipListSet
  • CopyOnWriteArrayList
  • CopyOnWriteArraySet
  • ArrayBlockingQueue
  • LinkedBlockingQueue
  • PriorityBlockingQueue
  • LinkedBlockingDeque
  • ConcurrentLinkedQueue

Callable

  • Runnable 不能返回结果和抛出异常 因此出现了Callable

常用辅助类

CountdownLatch

  • 一个线程 等多个线程完成后 再继续

    CyclicBarrier

  • 多个线程互相等待,直到到达同一个同步点,再继续一起执行

    Semaphore

  • 多个共享资源互斥的使用

读写锁

  • 读锁 共享锁
  • 写锁 独享锁

阻塞队列

四组API
image.png

线程池

  • 四大方法 single fixed cache schedule
  • 七大参数 coresize maxcoresize 阻塞队列 拒绝策略 时间 时间单位 线程工厂
  • 四种拒绝策略
    • 1.new ThreadPoolExecutor.AbortPolicy() 线程池不够用了,还有任务,就抛出异常
    • 2.new ThreadPoolExecutor.CallerRunsPolicy() 哪来的哪去
    • 3.new ThreadPoolExecutor.DiscardPolicy() 队列满了,丢掉任务,不会抛出异常
    • 4.new ThreadPoolExecutor.DiscardOldestPolicy() 队列满了,尝试和最早的竞争,也不会抛出异常

函数式接口

  • 只有一个方法的接口

Supply Consumer Function Predicted

Stream计算

分支合并ForkJoin

  • 任务窃取

JMM内存模型

image.png

volatile

提供轻量级的同步机制
加入内存屏障所用的关键字。cpu不知道何时加入。

  • 可见性 volatile 将数据刷入主存
  • 有序性 禁止指令重排
  • 非原子

原子类

不用lock synchronized 怎么保证原子

指令重排

  • jvm的指令重排
  • cpu指令的指令重排
  • 内存级别的指令重排 (指令重排的原因是因为在cpu和缓存中引入了storebuffer)

CAS

  • 比较工作内存和主内存中的值是否一样 一样就执行 不一样就循环

缺点:

  • 耗时
  • aba

原子引用

+版本号