多线程

进程和线程的区别

Java进程和线程的关系

Thread中的start和run方法的区别

Thread和Runnable的关系

如何给run()方法传参

线程返回值

线程的状态

sleep和wait的区别

notify和notifyAll的区别

锁池:
假设线程A已经拥有了某个对象(不是类)的锁,而其它线程B、C想要调用这个对象的某个synchronized方法(或者块),由于B、C线程在进入对象的synchronized方法(或者块)之前必须先获得该对象锁的拥有权,而恰巧该对象的锁目前正被线程A所占用,此时B、C线程就会被阻塞,进入一个地方去等待锁的释放,这个地方便是该对象的锁池
等待池:
假设线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁,同时线程A就会进入到了该对象的等待池,进入到等待池中的线程不会去竞争该对象的锁

yield

当调用Thread.yield()函数时,会给线程调度器一个当前线程愿意让出CPU使用的暗示,但是线程调度器可能会忽略这个暗示

中断线程

synchronized

线程安全问题的主要诱因

解决问题的根本方法:
同一时刻有且只有一个线程在操作共享数据,其它线程必须等到该线程处理完数据后再对共享数据进行操作
互斥锁的特性

synchronized锁的不是代码,锁的是对象。
根据获取的锁的分类:获取对象锁和获取类锁

synchronized底层实现原理

实现synchronized的基础

对象在内存中的布局

自旋锁

自适应自旋锁

锁消除

锁粗化

synchronized的四种状态

synchronized和ReentrantLock的区别

volatile

当写一个volatile变量时,JMM会把该线程对应的工作内存中的共享变量值刷新到主存中;
当读取一个volatile变量时,JMM会把该线程对应的工作内存置为无效
内存屏障(Memory Barrier)

通过插入内存屏障指令禁止在内存屏障前后的指令执行重排序优化
强制刷出各种CPU的缓存数据,因此任何CPU上的线程都能读到这些数据的最新版本

volatile和synchronized的区别

CAS

一种高效实现线程安全性的方法

CAS思想

缺点

Java线程池

利用Executors创建不同的线程池满座不同场景的需求

Fork/Join框架

为什么使用线程池

JUC的三个Executor接口

ThreadPoolExecutor

新任务提交execute执行后的判断

线程池的状态

线程池的大小如何选定

发表评论

发表
Table of Contents