
并发编程
文章平均质量分 95
jack xu1
stay hungry,stay foolish..
展开
-
实现生产者消费者模式的三种方式
什么是生产者消费者模式简单来说,生产者消费者模式就是缓冲区。那么这么做有两个好处,一个是解耦,第二个是平衡生产能力和消费能力的差,因为生产者和消费者的速度是不一样的,有了这个缓冲区就可以平衡这样一个落差,达到动态平衡。那么这个缓冲区其实就是一个队列,它的规则就是当队列是满的时候,生产者会被阻塞。当队列为空的时候,消费者会被阻塞, 在java中实现生产者消费者模式有多种方式,主要是线程间的通信,这里介绍三种:wait/notify、await/signal和阻塞队列。wait/notifywait原创 2022-05-23 12:43:58 · 591 阅读 · 0 评论 -
多线程顺序执行的几种写法
前言这是一道常见面试题,我也碰到过,下面介绍的这几种写法也是对并发编程常用工具掌握程度的一个考察,是一道很好的面试题。一共有以下几种写法,下面来分别介绍。join写法(两种写法)线程池写法wait、notify写法Condition写法CountDownLatch写法CyclicBarrier写法Thread.sleep写法CompletableFuture写法join写法join()方法的作用,把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。也就是说,原创 2022-01-16 23:38:19 · 2701 阅读 · 0 评论 -
异步编程Future掌控未来
Callable有了Runnable,为什么还要Callable?我们先来看下Callable的接口:public interface Callable<V> { /** * Computes a result, or throws an exception if unable to do so. * * @return computed result * @throws Exception if unable to compute a re原创 2021-11-28 21:43:59 · 668 阅读 · 0 评论 -
强引用和弱引用的Threadlocal
从SimpleDateFormat开始首先看一个例子,创建20个线程,线程里就干一件事,就是转换时间public class ThreadLoaclExample { //非线程安全的 private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static Date parse(String strDate) throws ParseExcep原创 2021-11-21 19:10:53 · 943 阅读 · 0 评论 -
老生常谈线程基础的几个问题
实现线程只有一种方式我们知道启动线程至少可以通过以下四种方式:实现 Runnable 接口继承 Thread 类线程池创建线程带返回值的 Callable 创建线程但是看它们的底层就一种方式,就是通过new Thread()实现,其他的只不过在它的上面做了层封装。实现Runnable接口要比继承Thread类的更好:结构上分工更明确,线程本身属性和任务逻辑解耦。某些情况下性能更好,直接把任务交给线程池执行,无需再次new Thread()。可拓展性更好:实现接口可以多个,而继承只能原创 2021-09-14 20:02:17 · 336 阅读 · 0 评论 -
ReentrantLock介绍及AQS源码精讲
LockLock是J.U.C中最核心的工具,它的作用和前面所讲解的synchronized一样,也是用来解决多线程环境下的线程安全性问题。在J.U.C这个包中,很多的地方都有用到Lock这个机制。J.U.C全称是java.util.concurrent,是并发编程中比较常用的工具包,这个包中包含很多用来在并发场景中使用的组件,比如线程池、阻塞队列、计时器、同步器、并发集合等等。并发包的作者是大名鼎鼎的Doug Lea。在Lock接口出现之前,Java中的应用程序对于多线程的并发安全处理只能基于sy原创 2021-09-04 21:16:11 · 184 阅读 · 0 评论 -
ConcurrentHashMap源码精讲
哈希表哈希表也叫散列表,这种数据结构提供了键(Key)和值(Value)的映射关系。只要给出一个key,就可以高效查找到它所匹配的value,时间复杂度接近于O(1)。如下所示:1.7和1.8的区别主要是两方面的,一方面是1.7里加锁用的是segment分段锁,锁的粒度较大。1.8里面用的是synchronized+CAS来实现的,锁的粒度也从分段锁缩小为节点锁。第二个是数据结构的层面,1.7里面是数组+链表,1.8里面是数组+链表+红黑树,时间复杂度O(n) -> O(logn)。 如下所原创 2021-08-26 22:21:48 · 197 阅读 · 0 评论 -
深入探究volatile和JMM内存模型
小伙们大家好,本篇是并发编程的第三篇,上一节跟大家讲了synchronized,这一节我们来聊聊他的好兄弟volatile,volatile的功能稍微差一点,他只有可见性和有序性,那么他的底层是如何保障可见性和有序性,以及什么是Java内存模型,本篇文章将给出通俗易懂的解释。。可见性什么是可见性先来看一段代码/** * @author jack xu */public class V...原创 2020-05-03 16:25:35 · 304 阅读 · 0 评论 -
线程池源码精讲
前言大家好,我是jack xu,本篇是并发编程的第二篇,今天跟大家聊一聊线程池的那点事。本篇文章有点长,小伙们静下心、耐下心来把他看完。。为什么要使用线程池1)降低创建线程和销毁线程的性能开销2)提高响应速度,当有新任务需要执行是不需要等待线程创建就可以立马执行3)合理的设置线程池大小可以避免因为线程数超过硬件资源瓶颈带来的问题我们来看阿里巴巴的代码规范,在项目中创建线程必须要使用线...原创 2020-04-16 13:14:32 · 243 阅读 · 0 评论 -
大话Synchronized及锁升级
前言小伙伴大家好,我是jack xu,今天是清明假期,跟大家来聊一聊synchronized。本篇是并发编程中的第一篇,为什么说是第一篇呢,因为并发编程涉及的东西太多太多,晦涩难懂,随便一个知识点拉出来都可以写一篇文章,如此算来写完并发编程一个系列最起码要十篇。我将知识点进行了总结归纳,排类分类,用通俗易懂的方式来跟大家说清楚、讲明白。。为什么要用Synchronized这个问题很简单,首先...原创 2020-04-16 12:19:16 · 233 阅读 · 0 评论