(四)Java深入理解并发编程之无锁CAS机制与魔法类Unsafe与原子包Atomic 其实在我们上一篇文章阐述Java并发编程中synchronized关键字原理的时候我们曾多次谈到过CAS这个概念,那么它究竟是什么?实际上我们在之前往往为了解决多线程并行执行带来的线程安全问题去利用加锁的机制去将多线程并行执行改变为单线程的串行执行,而实则还有另一种手段能够去避免此类问题的发生 juejin 2022-11-10 53
(十五)J并发编程终章:深入理解Java并发编程系列总纲 磕磕绊绊近半年时间,在工作之余,前后一共写了十余篇深入Java并发编程系列的文章,由于内容颇多,所以在这里列一个目录方便诸位翻阅。 juejin 2022-11-10 91
(十四)Java并发之线程、进程、纤程、协程、管程与死锁、活锁、锁饥饿的详解 在之前对于并发编程这个模块的内容已经阐述了很多篇章了,而本章的目的则是为了对前述的内容做个补充,重点会围绕着锁的状态与并行处理的方式进行展开论述。 juejin 2022-11-10 85
(十三)JAVA并发编程之分布式架构下的Redis、ZK分布式锁全面理解 在前面的大部分文章中,我们反复围绕着线程安全相关问题在对Java的并发编程进行阐述,但前叙的文章中都是基于单体架构的Java程序进行分析的,而如今单体的程序远不足以满足日益渐增的用户需求,所以一般目前Java程序都是通过多机器、分布式的架构模式进行部署。那么在多部署环境下,之前我们分析的CAS无锁、隐式锁、显式锁等方案是否还有效呢?答案是无效。 juejin 2022-11-10 93
(十一)JAVA的JUC分治思想产物-ForkJoin分支合并框架原理剖析上篇 在上篇文章《深入理解并发之Java线程池、工作原理、复用原理及源码分析》中,曾详细谈到了Java的线程池框架。在其中也说到了JDK提供的四种原生线程池以及自定义线程池,而本文则再来详细谈谈JDK1.7中新推出的线程池:ForkJoinPool。但ForkJoinPool的出现并不是为了替代ThreadPoolExecutor,而是作为它的补充,因为在某些场景下,它的性能会比ThreadPoolExecutor更好。 juejin 2022-11-09 2726
(十)Java并发编程之深入理解线程池、工作原理、复用原理及源码的分析 异步/多线程,对于一个业务方法而言,如果其中的调用链太长势必会引起程序运行时间延长,导致整个系统吞吐来量下降,而我们使用多线程方式来对该方法的调用链进行优化,对于一些耦合度不是特别高的调用关系可以直接通过多线程来走异步的方式进行处理,大大的缩短了程序的运行时长,但是如果我们的多线程创建方式是通过 new Thread();这种方式去进行显式创建的话它真的可以吗?答案是不可以,Why? juejin 2022-11-09 91
(九)Java并发编程之并发容器:阻塞队列、写时复制容器、锁分段容器的原理详谈 相信大家在学习JavaSE时都曾接触过容器这一内容,一般Java中的容器可分为四类:Map、List、Queue以及Set容器,而在使用过程中,对于ArrayList、HashMap等这类容器都是经常使用的,但问题在于这些容器在并发环境下都会存在线程安全问题。 juejin 2022-11-09 47
(八)Java并发之Runnable、Callable、FutureTask和CompletableFuture原理分析 关于Runnable、Callable接口大家可能在最开始学习Java多线程编程时,都曾学习过一个概念:在Java中创建多线程的方式有三种:继承Thread类、实现Runnable接口以及实现Callable接口。但是实则不然,真正创建多线程的方式只有一种:继承Thread类,因为只有new Thread().start()这种方式才能真正的映射一条OS的内核线程执行,而关于实现Runnable接口以及实现Callable接口创建出的Runnable、Callable对象在我看来只能姑且被称为“多线程任务”,因为无论是Runnable对象还是Callable对象,最终执行都要交由Thread对象来执行。 juejin 2022-11-09 89
(七)Java并发编程之解析线程变量副本ThreadLocal的原理分析 ①破坏多线程条件:同一时刻,一条线程对共享资源进行非原子性操作,不会产生线程安全问题 ②破坏共享资源条件:同一时刻多条线程对局部资源进行非原子性操作,也不会产生线程安全问题 ③破坏非原子性条件:同一时刻多条线程对共享资源进行原子性操作,也不会产生线程安全问题 juejin 2022-11-09 126