并发编程
文章平均质量分 71
线程基础+JUC
ChenJieYaYa
这个作者很懒,什么都没留下…
展开
-
Stream
引入1.方法引用::相当于创建Class对象class,通过实例对象class调用对应方法1.构造器方法引用:Class::new(调用默认构造器)2.类静态方法引用:Class::static_method3.类普通方法引用:Class::method4.实例方法引用:Instance::method2.函数式接口@FunctionalInterface函数式接口只有1个抽象方法,不包括与Object方法重名的方法(从Object继承过来的抽象方法)函数式接口定义@Functio原创 2022-05-02 17:07:17 · 376 阅读 · 0 评论 -
AQS原理源码解读
原文指路AQS类1.类图红色线是内部类AbstractOwnableSynchronizer:抽象类,定义存储独占当前线程的属性和设置,获取当前线程的方法AbstractQueuenSynchronize:抽象类,AQS框架核心类,内部以虚拟队列的方式管理线程的锁获取与锁释放,其中获取锁(tryAcquire方法)和释放锁(tryRelease方法)并没有提供默认的实现,需要子类重写方法的具体逻辑,目的是使开发人可以自定义获取锁和释放锁的方式Node:AbstractQueuenSynchr原创 2022-04-30 19:25:30 · 193 阅读 · 0 评论 -
利用AQS自定义XXX
AQS概述AbstractQueuedSynchronizer(抽象队列式同步器)多线程访问共享资源的同步器框架AQS是实现锁的关键锁面向使用者,AQS面向锁实现者模板模式AQS底层原理1.stateAQS内部用volatile修饰的int类型的成员变量state来控制同步状态state=0:表示没有线程正在独占共享资源的锁state=1:表示有线程正在共享资源的锁state既可以表示锁占没占,也可以表示占多少1.占没占 独占锁state两个状态01表示占没占原创 2022-04-25 18:11:54 · 315 阅读 · 1 评论 -
显式锁基础知识
ObjectMonitor锁类型1.可重入锁同一个线程多次获取同一把锁2.公平锁多个线程按照申请锁的顺序去获得锁线程会直接进入队列去排队永远都是队列的第一位才能得到锁排队不插队优点所有的线程都能得到资源,不会饿死在队列中缺点吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大源码3.非公平锁多个线程申请锁时,直接尝试获取锁,获取不到进入队列去排队优点减少CPU唤醒线程的开销,整体的吞吐效率会高点,减少CPU原创 2022-04-25 14:45:14 · 115 阅读 · 0 评论 -
线程池基础知识
作用节省创建和销毁线程的时间和系统开销解决资源不足问题提高线程可管理性线程池简单实现1.工作原理创建固定线程保存到数组用户提交任务到阻塞队列线程不断循环从阻塞队列头部取一个任务运行2.组件工作线程数组任务堵塞队列3.简单实现public class MyThreadPool { //默认线程数 private static int WORK_NUM = 5; //默认任务数 private static int TASK_NUM = 10原创 2022-04-18 20:34:34 · 223 阅读 · 0 评论 -
CAS+Unsafe+Atomic
并发发展1.synchronized阻塞锁机制(BIO)问题+缺点1.拿到锁的线程一直不释放锁如何处理2.大量资源竞争,消耗CPU,同时会造成死锁或其他安全问题3.每次执行synchronized需上下文切换,消耗特大4.大多数场景,并发操作粒度很小,synchronized有sjynd嫌疑2.volatile解决synchronized问题非阻塞volatile解决共享变量在多线程间的可见性但volatile不保证原子性3.CASJDK提供的非阻塞原子性操作,通过硬件原创 2022-04-18 18:45:01 · 146 阅读 · 0 评论 -
线程并发工具类
java.util.concurrent1.Fork/Join分而治之工作密取A线程比B线程先运行完,则从B工作队列的最后取一个任务交给A(A帮B的忙) 多线程开发核心:快+资源不能争抢+充分利用资源(尽量让CPU全部跑起来)使用流程ForkJoinTask--方法------------------------------------1.fork():将某子任务发生给ForkJoin执行器 相当于invokeAll(task1,task2...)2.join():等.原创 2022-05-01 19:06:20 · 515 阅读 · 0 评论 -
并发编程JUC
历史发展线程并发工具类java.util.concurrent1.Fork/Join分治工作密取–阈值原创 2022-05-02 17:08:45 · 630 阅读 · 0 评论 -
线程高级部分
现代计算机的内存模型1.指令与数据指令:由CPU处理器执行数据:存储在主内存当中2.问题情景问题1: 计算机的存储设备与处理器的运算速度有几个数量级的差距解决1: 现代计算机系统加入一层读写速度接近处理器运算速度的高速缓存(Cache),作为内存与处理器之间的缓冲(仅次于CPU寄存器),避免了每次从主存读取数据3.高速缓存一级缓存L1,二级缓存L2,三级缓存L3(多核共享)内存模型4.读写操作5.总线缓存一致性问题1.问题描述多个处理器运算任务都涉及同一主内原创 2022-03-27 22:53:28 · 466 阅读 · 0 评论 -
线程基础知识
概述1.解决的问题阻塞操作:键盘输入耗时操作:循环时间片轮转策略2.I/OBIO:阻塞式NIOAIO:异步操作进程与线程1.引入系统性能瓶颈:等待时间过长,假死,阻塞用户输入一个指令,计算机做一个操作,当用户在思考或输入数据时,计算机就在等待===》批处理操作系统出现问题1:如果有两个任务A和B,A执行到一半时需要读取大量的数据输入,此时CPU只能静静地等待A读取完数据才能继续执行===》白白浪费CPU资源解决1+问题2:内存中装多个程序,当A执行耗时操作时,让CPU执原创 2022-01-15 00:36:54 · 150 阅读 · 0 评论