Java进阶-并发-基础

2022-04-11  本文已影响0人  GIT提交不上

一、线程基础

参考链接:Java多线程-合集

1.1 基本概念

Java线程状态迁移图.png Java内存模型.png 运行时数据区.png

1.2 AQS-抽象队列同步器

AQS模型.png

AbstractQueuedSynchronizer
https://www.jianshu.com/p/8eadabbcc5a9

1.3 线程池

线程池状态转化图.png 任务执行过程.png

1.4 同步/异步/阻塞/非阻塞

https://www.zhihu.com/question/19732473
https://blog.csdn.net/qq_39515350/article/details/120854214

二、JUC包

instance =  new Test();
//读取到的instance不为null,instance引用对象可能没有完成初始化
memory = allocate();  // 1 分配对象内存空间
instance(memory);  // 2 初始化对象
instance = memory;  // 3 设置instance指向分配的内存地址,此时!=null
步骤2和3不存在数据依赖关系,可能存在指令重排
//AtomicInteger#getAndIncrement
public final int getAndIncrement() {
    //this-当前对象 valueOffset-内存地址偏移量
    return unsafe.getAndAddInt(this, valueOffset, 1);  
}

//Unsafe类
public final int getAndAddInt(Object var1, long var2, int var4) {
    int var5;
    do {
        //主内存真实的值 不断自旋-获取主内存的值
        var5 = this.getIntVolatile(var1, var2);
        //var5 + var4更新值返回 true -- 自旋 比较值
     } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
    return var5;
}
//写时复制思想,读写分离
public boolean add(E e) {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        Object[] elements = getArray();
        int len = elements.length;
        Object[] newElements = Arrays.copyOf(elements, len + 1);
        newElements[len] = e;
        setArray(newElements);
        return true;
    } finally {
        lock.unlock();
    }
}
//底层也是CopyOnWriteArrayList
public CopyOnWriteArraySet() {
    al = new CopyOnWriteArrayList<E>();
}

CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;而CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;另外,CountDownLatch是不能够重用的,而CyclicBarrier是可以重用的。Semaphore和锁类似,它一般用于控制对某组资源的访问权限。

jps -l 
jstack -l pid > jstack.out  
https://fastthread.io/
CPU密集型:任务需要大量的计算,没有阻塞,CPU一致全速运行;公式:CPU核数+1个线程的线程池。
I/O密集型:公式:2*CPU核数;公式:CPU核数/(1-阻塞系数),阻塞系数在0.8~0.9之间。
//获取PCU核数
Runtime.getRuntime().availableProcessors()

https://www.shangmayuan.com/a/5845a0a8e2dc4e86b7f3c143.html

上一篇 下一篇

猜你喜欢

热点阅读