====== Java并发 ======
参考资料:
[[https://cyc2018.github.io/CS-Notes/#/notes/Java%20%E5%B9%B6%E5%8F%91|并发面试手册]]
[[https://www.processon.com/view/5c25db87e4b016324f447c95?fromnew=1|关于偏向锁&轻量级锁获取流程]]
[[https://www.processon.com/view/5d6bdca2e4b0fb9fe2d4c45a?fromnew=1|AQS独占式获取锁流程]]
[[https://www.processon.com/view/5d6be56de4b0f425534723cd?fromnew=1|AQS共享式获取锁流程]]
[[https://www.processon.com/view/5d5662cde4b08b95b820f2e7?fromnew=1#map|高并发编程的艺术]] 其实把这一篇看看完足够了
====== 如何实现多线程 ======
三种实现方式:实现Runnable接口,实现Callable接口,或者继承Thread类(其实Thread类也是实现的Runnable接口)
Callable和Runnable的区别: Callable还允许线程带有返回值返回,而Runnable没有
不过真正大家写代码的时候,都是用Executor线程池的方式。
====== 线程状态及相互通信 ======
{{:java-concurrent:线程状态图.png?1200|}}
ThreadA a = new ThreadA(); //此时是New状态
a.start(); //此时是Runnable状态(可能正在执行,也可能正在等待CPU的时间片)
//当使用同一个对象的synchronized线程中,有一个线程获得锁,执行synchronized的方法体,那么其他线程就Blocked的状态
//当线程执行方法体内调用 wait()时,那么就会释放锁,然后进入Waiting 无限期等待 状态
//当线程执行方法体内调用notify(), notifyAll() 就能将wait的线程恢复为Runnable.
Thread.sleep(3000) //此时本线程进入 Timing Waiting有限时间等待的状态,但不会释放锁。
另外:
任何异常会导致线程 释放锁,线程终止,所以必须catch异常。
await, signal,signalAll 相当于是jdk版本的实现。 wait(), notify(), notifyAll() 是jvm版实现
类似ReentrantLock是同步锁的jdk版本实现,synchronized关键字是同步锁的jvm版本实现
====== 并发工具类 ======
并发工具类:CountDownLatch, CyclicBarrier, Semaphore的使用, 参考 [[java-concurrent:aqs|并发工具类]]
====== 关于线程池 ======
请参考:[[java-concurrent:executor|线程池]]
====== 关于Java内存模型 ======
java线程之间的通信由java内存模型(JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。
从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间 的共享变量存储在主内存中,
每个线程都有一个私有的本地内存,本地内存存储了该线程以读/写共享 变量的副本。
重排序(编译器和处理器为了优化性能而做的指令重排序)
JMM限制重排序 为程序员提供内存可见性保证
happens-before 八大原则
====== volatile & sychronized ======
volatile大致的原理: 写入到工作内存的时候,立刻刷新到主内存。
读工作内存的时候,置失效,直接去主内存读。
sychronized: 可重入
http://www.morganliao.com/wiki/doku.php?id=java-concurrent:sychronized
ReentrantLock 相当于 synchronized的jdk版实现。但是比后者更强大,更灵活。同时支持公平锁。 可重入
====== 并发集合 ======
CurrentHashMap
https://blog.csdn.net/liuyuanq123/article/details/80283913
JDK7的实现和 JDK8的实现
https://www.cnblogs.com/lijiasnong/p/9963808.html
CopyOnWrite