并发中线程状态:
1.新建 :创建后尚未启动。
2.可运行 : 可能正在运行,也可能正在等待 CPU 时间片。包含了操作系统线程状态中的 Running 和 Ready。
3.阻塞 : 等待获取一个排它锁,如果其线程释放了锁就会结束此状态
4.无限期等待 :等待其它线程显式地唤醒,否则不会被分配 CPU 时间片
5.限期等待 :无需等待其它线程显式地唤醒,在一定时间之后会被系统自动唤醒。
6.死亡
操作系统中线程状态:
1.新建 2.就绪 3.运行 4.阻塞 5.销毁
使用线程
1.实现Runnable接口,实现run()方法
2.实现Callable接口,实现call()方法
3.继承Thread类,重写run()方法
4.使用Executor多线程并发框架创建线程池 详见Executor框架及Java并发编程
同步:包括互斥锁和共享锁
互斥锁
1.第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现的 ReentrantLock(重入锁)。
比较
1. 锁的实现
synchronized 是 JVM 实现的,而 ReentrantLock 是 JDK 实现的。
2. 性能
新版本 Java 对 synchronized 进行了很多优化,例如自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等,synchronized 与 ReentrantLock 大致相同。
3. 等待可中断
当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情。
ReentrantLock 可中断,而 synchronized 不行。
4. 公平锁
公平锁是指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁。
synchronized 中的锁是非公平的,ReentrantLock 默认情况下也是非公平的,但是也可以是公平的。
5. 锁绑定多个条件
一个 ReentrantLock 可以同时绑定多个 Condition 对象。
共享锁 (JUC-AQS)
1.CountDownLatch:用来控制一个线程等待多个线程完成后再继续执行
2.CyclicBarrier(循环屏障):控制多个线程相互等待,只有当多个线程都到达时,这些线程才会继续执行。
3.Semaphore:类似于操作系统中的信号量,可以控制对互斥资源的访问线程数。
原子数:
内存模型(JMM)
包括主内存-工作内存-线程
JMM三大特性:
1.原子性 :可使用原子类或synchronized实现
2.可见性:可使用final、volatile(修饰的变量被修改后会直接更新主内存内容,读取被volatile修饰的变量时认为工作内存中该对象无效,直接从主内存中读取)、synchronized
3.有序性:可使用volatile(禁止指令重排序)、synchronized实现
非阻塞同步:
1.原子类
2.CAS(比较交换)
可能产生的问题:
第一个ABA问题:解决方案:版本号
第二个可能导致长时间无法执行成功
原文:https://github.com/CyC2018/CS-Notes/blob/master/notes/Java%20%E5%B9%B6%E5%8F%91.md