![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 94
多线程
qq_39093474
这个作者很懒,什么都没留下…
展开
-
实现生产者消费者的三种方式
永远在while循环中对条件进行判断而不是if语句中进行wait条件的判断;使用NotifyAll而不是使用notify。翻译 2023-08-02 09:36:54 · 102 阅读 · 0 评论 -
并发工具之CountDownLatch与CyclicBarrier
跑道起点就相当于“barrier”,是临界点,而这6个运动员就类比成线程的话,就是这6个线程都必须到达指定点了,意味着凑齐了一波,然后才能继续执行,否则每个线程都得阻塞等待,直至凑齐一波即可。在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join方法,让主线程等待被join的线程执行完之后,主线程才能继续往下执行。这里的6个线程,也就是计数器的初始值6,是通过CyclicBarrier的构造方法传入的。翻译 2023-07-31 09:20:26 · 83 阅读 · 0 评论 -
并发工具之Semaphore与Exchanger
我们来模拟这样一个情景,在青春洋溢的中学时代,下课期间,男生经常会给走廊里为自己喜欢的女孩子送情书,相信大家都做过这样的事情吧。有一天,班主任需要班上10个同学到讲台上来填写一个表格,但是老师只准备了5支笔,因此,只能保证同时只有5个同学能够拿到笔并填写表格,没有获取到笔的同学只能够等前面的同学用完之后,才能拿到笔去填写表格。,也就是允许的最大并发执行的线程个数为5,可以看出,前5个线程(前5个学生)先获取到笔,然后填写表格,而6-10这5个线程,由于获取不到许可,只能阻塞等待。,用于两个线程间交换数据。翻译 2023-07-28 18:07:28 · 79 阅读 · 0 评论 -
并发工具之CountDownLatch与CyclicBarrier
跑道起点就相当于“barrier”,是临界点,而这6个运动员就类比成线程的话,就是这6个线程都必须到达指定点了,意味着凑齐了一波,然后才能继续执行,否则每个线程都得阻塞等待,直至凑齐一波即可。在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join方法,让主线程等待被join的线程执行完之后,主线程才能继续往下执行。这里的6个线程,也就是计数器的初始值6,是通过CyclicBarrier的构造方法传入的。翻译 2023-07-28 15:23:30 · 73 阅读 · 0 评论 -
Java 8 的异步编程利器 CompletableFuture 详解
的get()方法是阻塞的,我们一般建议使用。并且一般建议使用自定义线程池。但是如果线程池拒绝策略是或者,当线程池饱和时,会直接丢弃任务,不会抛弃异常。因此建议,线程池策略最好使用,然后耗时的异步线程,做好线程池隔离哈。翻译 2023-07-27 18:07:21 · 237 阅读 · 0 评论 -
FutureTask详解
在Executors框架体系中,FutureTask用来表示可获取结果的异步任务。FutureTask实现了Future接口,FutureTask提供了启动和取消异步任务,查询异步任务是否计算结束以及获取最终的异步任务的结果的一些常用的方法。通过get()方法来获取异步任务的结果,但是会阻塞当前线程直至异步任务执行结束。一旦任务执行结束,任务不能重新启动或取消,除非调用runAndReset()方法。未启动。翻译 2023-07-25 16:40:03 · 84 阅读 · 0 评论 -
并发容器之ArrayBlockingQueue与LinkedBlockingQueue详解
在多线程编程过程中,为了业务解耦和架构设计,经常会使用并发容器用于存储多线程间的共享数据,这样不仅可以保证线程安全,还可以简化各个线程操作。例如在“生产者-消费者”问题中,会使用阻塞队列(BlockingQueue)作为数据容器,关于BlockingQueue可以看这篇文章。为了加深对阻塞队列的理解,唯一的方式是对其实验原理进行理解,这篇文章就主要来看看ArrayBlockingQueue和LinkedBlockingQueue的实现原理。翻译 2023-07-25 16:31:31 · 806 阅读 · 0 评论 -
并发容器之BlockingQueue详解
在实际编程中,会经常使用到JDK中Collection集合框架中的各种容器类如实现List,Map,Queue接口的容器类,但是这些容器类基本上不是线程安全的,除了使用Collections可以将其转换为线程安全的容器,Doug Lea大师为我们都准备了对应的线程安全的容器,如实现List接口的CopyOnWriteArrayList(关于CopyOnWriteArrayList可以看这篇文章),实现Map接口的ConcurrentHashMap(关于ConcurrentHashMap可以看这篇文章。翻译 2023-07-17 14:19:44 · 226 阅读 · 0 评论 -
深入理解ReentrantLock及AQS原理
1. Lock接口前面我们说过解决线程同步问题是使用关键字synchronized,synchronized是一个隐式锁,即锁的释放和持有都是隐式的,我们无需干预,而本篇我们要说的是显式锁,即锁的释放和持有都必须由我们手动编写,在Java 5中,官方在concurrent并发包中加入Lock接口,该接口提供了lock()方法和unlock()对显示加锁和显示释放锁操作进行支持。源码如下:public interface Lock { //加锁 void lock(); //可中断获翻译 2022-09-01 16:39:18 · 521 阅读 · 0 评论 -
并发容器之CopyOnWriteArrayList详解
Java学习者都清楚ArrayList并不是线程安全的,在读线程在读取ArrayList的时候如果有写线程在写数据的时候,基于fast-fail机制,会抛出异常,也就是说ArrayList并不是一个线程安全的容器,当然您可以用Vector,或者使用的静态方法将ArrayList包装成一个线程安全的类,但是这些方式都是采用Java关键字对方法进行修饰,利用独占式锁来保证线程安全的。但是,由于独占式锁在同一时刻只有一个线程能够获取到对象监视器,很显然这种方式效率并不是太高。翻译 2023-07-14 18:08:08 · 88 阅读 · 0 评论 -
并发编程的优缺点
一直以来,硬件的发展极其迅速,也有一个很著名的"摩尔定律",你可能会奇怪明明讨论的是并发编程为什么会扯到了硬件的发展,这其中的关系应该是多核CPU的发展为并发编程提供的硬件基础。按照所预测的速度,我们的计算能力会按照指数级别的速度增长,不久以后会拥有超强的计算能力,正是在畅想未来的时候,2004年,Intel宣布4GHz芯片的计划推迟到2005年,然后在2004年秋季,Intel宣布彻底取消4GHz的计划,也就是说摩尔定律的有效性超过了半个世纪戛然而止。因此,多核的CPU的背景下,催生了并发编程的趋势,翻译 2023-07-14 15:49:08 · 81 阅读 · 0 评论 -
详解Java并发编程中的各种锁
对应于生活中悲观的人,悲观的人总是想着事情往坏的方向发展。举个生活中的例子,假设厕所只有一个坑位了,悲观锁上厕所会第一时间把门反锁上,这样其他人上厕所只能在门外等候,这种状态就是了。回到代码世界中,,那线程每次想操作这个数据前都会假设其他线程也可能会操作这个数据,所以每次操作前都会上锁,这样其他线程想操作这个数据拿不到锁只能了。在Java语言中和等就是典型的悲观锁,还有一些使用了关键字的容器类如HashTable等也是悲观锁的应用。翻译 2022-10-09 23:27:07 · 97 阅读 · 0 评论 -
Java并发之原子性、有序性、可见性
指的是在CPU执行的过程中的特性。带来的原子性问题Java并发程序都是的,操作系统为了充分利用CPU的资源,将CPU分成若干个时间片,在多线程环境下,线程会被操作系统调度进行任务切换。为了直观的了解什么是原子性,我们看下下面哪些操作是原子性操作上面展示语句中,除了语句1是,其它两个语句都不是原子性操作,下面我们来分析一下语句2。其实语句2在执行的时候,包含三个指令操作1countCPU2+13对于上面的三条指令来说,如果线程A在指令1执行完后做线程切换,线程A和线程B。翻译 2022-10-07 23:31:29 · 212 阅读 · 0 评论 -
ThreadLocal详解
1. ThreadLocal简介1.1 ThreadLocal是什么?定义:提供线程局部变量,一个线程局部变量在多个线程中,分别有独立的值(副本)。ThreadLocal又叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就说该变量是当前线程独有的变量。ThreadLocal为变量在每一个线程中都创建了一个副本。那么每个线程都可以访问自己内部的副本变量。同一个ThreadLocal所包含的对象,在不同的Threa中有不同的副本,这里有几点需要注意翻译 2022-09-01 16:39:37 · 1600 阅读 · 0 评论 -
无锁CAS与Unsafe类及其并发包Atomic
在前面的文章中,我们也详谈过有锁并发的代表之一synchronized关键字。通过该关键字可以控制并发执行过程中有且只有一个线程可以操作共享资源。其原理是通过当前线程持有当前对象锁,从而拥有访问权限,而其他没有持有当前对象锁的线程没有访问权限,也就保证了线程安全,但是在本篇文章中,我们将会了解到另外一种反向而行的策略,即无锁并发,即不加锁也能让保证并发执行的安全性。本篇的思路是先阐明无锁执行者CAS的核心算法原理然后分析Java执行CAS的实践者Unsafe类,该类中的方法都是native修饰的,因此我们翻译 2022-09-01 16:38:55 · 94 阅读 · 0 评论 -
Java并发之synchronized实现原理
1. synchronized三种使用方式线程安全是并发编程的重点,如果我们出现安全问题将会导致严重的生产问题(比如秒杀时多卖了一台手机)。并发编程中造成线程安全的诱因主要有两点:一是存在共享资源(也称为临界资源)。二是二级三级目录......翻译 2022-09-01 16:38:32 · 772 阅读 · 0 评论 -
理解Java内存模型(JMM)及volatile关键字
文章目录1. 理解Java内存区域与Java内存模型1.1 Java内存区域1.2 Java内存模型三级目录1. 理解Java内存区域与Java内存模型1.1 Java内存区域Java虚拟机在运行程序时会把其自动管理的内存划分为以上几个区域,每个区域都有的用途以及创建销毁的时机,其中黄色部分代表的是所有线程共享的数据区域,而绿色部分代表的是每个线程的私有数据区域。本地内存:线程共享区域,在Java8中是本地内存,也是我们通常说的堆外内存。包含元空间和直接内存。不知道大家有没有注意到Java8和J翻译 2022-09-01 16:38:12 · 185 阅读 · 0 评论 -
多线程入门
首先我们来看一下进程的概念:看到这里大家可能都不太理解,其实我也不太清楚,不过看了宜春大佬的博客,有了小小的收获。就跟我们玩游戏差不多,点击游戏,游戏会把加载到内存中运行,系统为给他分配资源(这就是大家玩游戏卡的原因,内存只有1g,给他分了0.99g,不卡才怪。)此时进程内存的程序都可以叫做进程,退出游戏,就是进程从内存中销毁了。这里借用一下宜春大佬的图多线程就是多个线程同时运行或者交替运行,以前电脑只有一个cpu,多线程运行都是交替运行(并发),现在都是4核8核的,可以同时运行8个线程,做到真正的并行原创 2021-12-30 16:18:40 · 685 阅读 · 0 评论