线程与进程
进程是操作系统调度和分配资源的最小单元,每个进行有独立地址空间,不同的线程之间是隔离的。
每个进程至少有一个线程,也可以多个线程并发执行。
线程是CPU调度和分派的基本单位,同一个进程中的线程共享进程的资源
创建线程的成本比创建进程的成本低
并发与并行
线程
线程状态
线程并发安全
synchroized
JMM
乐观锁与悲观锁
悲观锁:悲观锁就像他的名字一样,他的基本思想就是假设每次都会有线程安全问题,所以每次访问资源都采用加锁的方式来避免线程安全问题。数据库中:行锁、共享锁、排他锁;java:synchronized、ReentrantLock;
乐观锁:乐观锁基本思想是每次对资源的访问不存在线程安全问题,因此直接操作数据,操作完成后通过某些机制来判断是都在此期间数据倍更改过,如果被更改则操作失败,否则操作成功。版本号机制、CAS
CAS
volatile
1、 保证线程间的可见性
volatile修饰共享变量,当一个线程修改了共享变量,能够防止编译器等优化发生,让一个线程对共享变量的修改对其他线程可见。(当一个线程修改了一个被 volatile 修饰的共享变量后,这个修改后的值会立即反映到主内存中。其他线程读取这个变量时,会从主内存中读取最新的值,而不是从线程的工作内存中读取可能过期的副本。这样就保证了不同线程间对这个变量的可见性。)
2、禁止指令重排序
volatile修饰的共享变量会在读写共享变量时加上一个屏障,阻止其他的读写操作越过共享变量,达到阻止指令重排序效果。
3、防止优化
JVM中可能会对代码进行优化,如果一个变量只读取不修改,那么JVM可能会缓存这个变量值,不再从主内存中读取最新值。
AQS
Lock与sychroized
死锁
concurrentHashMap
并发线程安全问题
线程池
核心线程数
3
线程池种类
线程池使用
线程池拒绝策略
1、中止策略:当线程池无法接受新任务时,抛出异常,不再处理新提交的任务。
2、丢弃策略:当线程池无法接受新任务时,直接丢弃任务,不处理也不抛出异常。
3、丢弃最旧任务:当线程无法接受新线程时,丢弃最旧任务,执行新任务。
4、调用者运行策略:该策略会让调用execute()方法的线程直接执行任务。