Table of Contents

Java并发

参考资料:

并发面试手册

关于偏向锁&轻量级锁获取流程

AQS独占式获取锁流程

AQS共享式获取锁流程

高并发编程的艺术 其实把这一篇看看完足够了

如何实现多线程

三种实现方式:实现Runnable接口,实现Callable接口,或者继承Thread类(其实Thread类也是实现的Runnable接口)

Callable和Runnable的区别: Callable还允许线程带有返回值返回,而Runnable没有

不过真正大家写代码的时候,都是用Executor线程池的方式。

线程状态及相互通信

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内存模型

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