并发编程百科全书
1、JVM层面分析线程
2、JVM各内存区意义
3、为什么要使用多线程以及带来的问题
4、线程的状态
5、Java中创建线程的方式
5.1.通过实现Runnable接口创建线程
5.2 通过实现Callable接口创建线程
5.3 通过继承Thread类创建线程
5.4通过线程池启动多线程
5.4.1 使用线程池创建线程的几种方式
5.4.2 线程池比自己创建线程的好处
5.4.3 Executor VS ExecutorService VS Executors
6、并发-Feature接口
7、线程上下文切换
8、Synchronized用法
8.1修饰一个代码块
8.2修饰一个方法
8.3修饰静态方法
8.4 修饰类
9、死锁
10、sleep() 与 wait()区别
一、sleep()属于Thread类的。 而wait()方法,则是属于Object类中的
二、sleep()方法导致了程序暂停执行指定的时间,让出cpu给其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态。
三、在调用sleep()方法的过程中,线程不会释放对象锁。
四、而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()或notifyAll()方法后本线程才进入对象锁定池准备(就绪)
获取对象锁进入运行状态。
11、线程间通信
一、Synchronized
二、共享内存
三、Wait() / notify()
四、消息队列
五、CountDownLatch类的countDown() 以及 await()方法
六、JAVA并发包下的Exchanger类exchange(data)方法
12、LOCK
12.1 常用方法
12.2 ReentrantLock可重入锁
12.2.1 与synchronized区别
12.2.2 使用
12.2.2.1 简单使用
12.2.2.2 公平锁使用
上例也是可重入锁的体现。 线程A都获取了锁,其他线程还可以获取,前提是各线程用同一lock,这点与synchronized常用的对象锁不同, Lock是不管你是否用什么对象,只要用同一lock就行;类似的,如果每个线程使用不同lock,则执行顺序是线程A获取锁→线程A释放锁→线程B获取锁→线程B释放锁……,不同锁,你们重入不了。
12.2.2.3 可中断锁使用
12.2.2.4 trylock()
trylock()类似。 就是等待之后,释放锁, 参考上文trylock()介绍。
12.3、ReadWriteLock 接口
注意:ReadWriteLock并不继承Lock接口
13、CAS (Compare And Swap)
13.1 demo
13.2 CAS 原理图
13.3 CAS缺点
14、Voliate 关键字
14.1内存模型相关概念
14.2 JAVA内存模型(JMM)对并发的控制
14.3 并发编程三个概念(原子性、可见性、有序性)
14.3.1 原子性
14.3.2 可见性
14.3.3 有序性
14.4 Voliate