先从SsingletionOBjects生成注入如果需要注入A就吧A放入early然后注入B

    如果没有在earlySingletonObjects中找

    CAS

    读取当前值 E 计算结果V,在读区当前值N
    如果E和N相等,将当前值更新为结果V

    ABA问题,别的线程更新为B有更新伟A
    读区N的时候发现不变,就继续更新
    如何解决,就加一个版本号

    SYNCHRONIZED为什么叫隐式锁,因为我们无法看到SYNCHRONIZED锁的是谁
    显示定义同步锁对象来实现同步,同步锁使用LOCK对象充当
    ReentrantLock

    线程的状态

    新生,运行
    阻塞,等待
    终止

    消费者生产者模式写法

    Condition
    进行精准的通知唤醒
    先判断,在等待,做事务进行唤醒

    image.png

    ConcurrentHashMap 1.7使用了内部Segment分段

    image.png
    这几个方法都只能在同步方法或者同步代码块之中使用,否则会抛出异常

    线程加锁的问题SYNchronized

    1. 一个线程持有锁会导致其他所有需要此锁的线程挂起
    2. 在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题
    3. 一个优先级高的线程等待一个优先级低的线程释放锁,会导致优先级倒置,引起性能问题。

    一般不通过stop和interupt来停止线程
    推荐让线程自动停止或者设置一个标志位来停止线程

    public void run(){
    while(flag){
    sout*(‘nihao’)
    }
    }

    public void stop(){
    flag=false;
    }

    守护线程和用户线程
    JVM虚拟机不需要等到守护线程运行结束
    image.png

    多线程之间的队列

    BlockingQUeue

    image.png

    SYnchronousQueue
    阻塞队列,必须等待取出来之后,才能往里面放一个元素

    线程池

    池化技术

    线程池可以复用,可以控制最大并发数,管理线程

    线程池的三大方法:
    image.png
    image.png

    最大线程应该如何定义
    CPU密集型

    有多少个核,就是多少,可以保持CPU效率最高

    IO密集型

    程序有15个大型任务,IO十分占用资源,判断程序中很消耗IO的线程,一般设置为其2倍

    四大函数式接口

    image.png

    ForkJoin

    forkJoin并行执行任务,提高效率,大数据量

    ForkJoin 工作窃取,维护了一个双端队列
    A线程执行慢,B线程偷去A的线程来进行计算

    异步回调

    image.png

    Volatile关键字

    1.保证可见性
    2.不保证原子性
    3.禁止指令重拍

    多线程指令重排会出现值的干扰
    vilatile可以避免
    内存屏障 CPU指令:
    禁止指令重排

    image.png

    JMM

    java内存模型,不存在的概念,是一个约定
    线程解锁钱,必须把共享变了立刻更新

    image.png

    单例模式:

    饿汉,再类中定义
    private static final通过静态方法来获得
    但是会浪费空间

    懒汉模式

    自己实现自旋锁
    image.png