先从SsingletionOBjects生成注入如果需要注入A就吧A放入early然后注入B
如果没有在earlySingletonObjects中找
CAS
读取当前值 E 计算结果V,在读区当前值N
如果E和N相等,将当前值更新为结果V
ABA问题,别的线程更新为B有更新伟A
读区N的时候发现不变,就继续更新
如何解决,就加一个版本号
SYNCHRONIZED为什么叫隐式锁,因为我们无法看到SYNCHRONIZED锁的是谁
显示定义同步锁对象来实现同步,同步锁使用LOCK对象充当
ReentrantLock
线程的状态
新生,运行
阻塞,等待
终止
消费者生产者模式写法
Condition
进行精准的通知唤醒
先判断,在等待,做事务进行唤醒
ConcurrentHashMap 1.7使用了内部Segment分段
这几个方法都只能在同步方法或者同步代码块之中使用,否则会抛出异常
线程加锁的问题SYNchronized
- 一个线程持有锁会导致其他所有需要此锁的线程挂起
- 在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题
- 一个优先级高的线程等待一个优先级低的线程释放锁,会导致优先级倒置,引起性能问题。
一般不通过stop和interupt来停止线程
推荐让线程自动停止或者设置一个标志位来停止线程
public void run(){
while(flag){
sout*(‘nihao’)
}
}
public void stop(){
flag=false;
}
守护线程和用户线程
JVM虚拟机不需要等到守护线程运行结束
多线程之间的队列
BlockingQUeue
SYnchronousQueue
阻塞队列,必须等待取出来之后,才能往里面放一个元素
线程池
池化技术
线程池可以复用,可以控制最大并发数,管理线程
线程池的三大方法:
最大线程应该如何定义
CPU密集型
有多少个核,就是多少,可以保持CPU效率最高
IO密集型
程序有15个大型任务,IO十分占用资源,判断程序中很消耗IO的线程,一般设置为其2倍
四大函数式接口
ForkJoin
forkJoin并行执行任务,提高效率,大数据量
ForkJoin 工作窃取,维护了一个双端队列
A线程执行慢,B线程偷去A的线程来进行计算
异步回调
Volatile关键字
1.保证可见性
2.不保证原子性
3.禁止指令重拍
多线程指令重排会出现值的干扰
vilatile可以避免
内存屏障 CPU指令:
禁止指令重排
JMM
是
java内存模型,不存在的概念,是一个约定
线程解锁钱,必须把共享变了立刻更新
单例模式:
饿汉,再类中定义
private static final通过静态方法来获得
但是会浪费空间
懒汉模式
自己实现自旋锁