![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程分析
文章平均质量分 79
龙小虬
很懒。
展开
-
并发编程------并发队列实现消息中间件
项目地址JUC_11什么是消息中间件MQ消息中间件,生产者将消息发送给MQ服务器端缓存起来,MQ将消息内容转发给MQ消费者。package disnetwork;import org.apache.commons.lang3.StringUtils;import java.util.concurrent.LinkedBlockingQueue;/** * @author 龙小虬 * @date 2021/5/6 22:28 */public class MQServer {原创 2021-05-07 15:36:32 · 86 阅读 · 0 评论 -
并发编程------ForkJoin
了解ForkJoin之前,先来了解一下stream()方法。ArrayList<String> strings = new ArrayList<String>();Stream<String> stream = strings.stream();Stream<String> stringStream = strings.parallelStream();上面的代码有着parallelStream()、stream()两个方法。他们分别代表着可多线程遍原创 2021-05-06 17:03:21 · 70 阅读 · 0 评论 -
并发编程------Threadlocal
ThreadlocalThreadLocal是Thread的局部变量,用于编多线程程序。Threadlocal是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据。为什么要使用Threadlocal从上面的定义可以了解到,他可以保证数据变成局部变量,这样也就保证了数据的不共享。那么使用方法是怎样的?import sun.misc.Launcher;import java.io.BufferedReader;import java.io.IOExcep原创 2021-05-06 12:30:19 · 93 阅读 · 0 评论 -
并发编程------线程池
线程池线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。为什么要使用线程原创 2021-04-30 12:40:17 · 92 阅读 · 0 评论 -
并发编程------CountDownLatch、Semaphore
加粗样式CountDownLatch在多线程并发编程中充当一个计数器的功能,并且维护一个count的变量,并且count变量的更改是原子操作,该类主要通过countDown()和await()两个方法实现功能的,首先通过建立CountDownLatch对象,并且传入参数即为count初始值。如果一个线程调用了await()方法,那么这个线程便进入阻塞状态,并进入阻塞队列。如果一个线程调用了countDown()方法,则会使count-1,并且使用原子操作更改数据;当count的值为0时,这时候阻塞队列中调原创 2021-04-29 17:15:42 · 170 阅读 · 0 评论 -
并发编程------ReentrantLock源码(二)
在前面我们提到了ReentrantLock的公平锁和非公平锁的使用,还有锁的释放和获取。我们之前也了解过synchronized,他是有着锁池和等待池的,也就是说他有着线程竞争锁失败的线程池,也有着手动将线程阻塞的调用方法,在ReentrantLock中,上面一章我们也了解了有着竞争锁的线程池,是利用双向链表存储的,其实ReentrantLock也有着手动阻塞的方法调用。这一章,我们就来了解一下它(Condition)。ConditionCondition是在java 1.5中才出现的,它用来替代传统原创 2021-04-29 11:25:10 · 47 阅读 · 1 评论 -
并发编程------ReentrantLock源码(一)
在前面的并发编程------CAS提到了手写lock锁,那我们现在来看看ReentrantLock的源码。以下代码是查看的ReentrantLock(false),也就是非公平锁ReentrantLockReentrantLock属于重入锁,先来看看他的无参构造方法。可以看到默认为非公平锁,那么我们今天主讲非公平锁。那我们要怎么才能使用公平锁?其实很简单:这个有参构造可以看到,只要参数为true,则创建的就是公平锁,为什么主讲非公平锁?因为他的效率比公平锁高。因为我们使用的CPU资源去运行线原创 2021-04-29 01:27:54 · 225 阅读 · 0 评论 -
并发编程------AQS(一)
AQS是AbstractQueuedSynchronizer的简称。AQS提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架,如下图所示。AQS为一系列同步器依赖于一个单独的原子变量(state)的同步器提供了一个非常有用的基础。子类们必须定义改变state变量的protected方法,这些方法定义了state是如何被获取或释放的。鉴于此,本类中的其他方法执行所有的排队和阻塞机制。子类也可以维护其他的state变量,但是为了保证同步,必须原子地操作这些变量。上面也提到了,他是并发中的同步队列原创 2021-04-26 21:37:00 · 85 阅读 · 0 评论 -
并发编程------synchronized(二)
我们一直都会看到有人说synchronized是重量级锁,其实并不然,这取决于是在什么情况,在jdk1.6之后,synchronized做出了优化,最后通过不同的情况使用不同的锁,一共有三种情况,也就是三种锁。1.偏向锁偏袒一个线程,当一个线程获取到锁之后,会在锁的对象头中会记录该线程的id,下次再进入到该同步代码块的时候,不需要再重复的加锁CAS操作和解锁,从而提高效率,整个过程简单理解为就是偏向锁。代码示例:import sun.applet.Main;/** * @author 龙小虬原创 2021-04-26 00:10:15 · 52 阅读 · 0 评论 -
并发编程------synchronized(一)
synchronized主要是用于遇到线程安全时的时候使用。synchronized关联到的锁对象有几种?对象锁synchronized 加到非静态方法前面是给对象上锁,或者自定义的对象。类锁synchronized 加到 static 方法前面是给class 加锁在后面我们再来解释两者的具体区别。汇编中的synchronized代码:/** * @author 龙小虬 * @date 2021/4/24 23:06 */public class Main exte原创 2021-04-25 00:05:27 · 115 阅读 · 0 评论 -
并发编程------CAS
CASCAS是C++写的,底层已经实现了原子性,所以需要使用UnSafe类,UnSafe类中使用jni技术来调用CAS中的compareAndSet,所以我们在 java只能看到compareAndSwapObject、compareAndSwapInt、compareAndSwapLong这三个方法是有四个参数,而第一个就是需要改变的对象(也就是this),后面两个可以分为E,N(前两个合并就是V)。当且仅当V=E时,将V=NV:内存值(共享变量)E:旧预值(工作内存)N:新值(修改后的值)在前原创 2021-04-23 14:00:11 · 144 阅读 · 0 评论 -
并发编程------锁的分析
锁的意义涉及到线程安全问题会使用锁,当多个线程在同时共享到同一个全局变量的时候,可能会受到其他线程干扰。一般只在写的操作上锁悲观锁与乐观锁1.悲观锁每次在执行同步代码块的时候都会去获取锁,如果没有获取到锁的情况下,当前线程进入阻塞状态,效率比较低。如果获取到锁,就需要从阻塞–>就绪,会有阻塞超时和等待锁。应用场景:synchronizedmysql行锁Lock锁在这里我们就利用mysql行锁来说明吧。在这之前我们需要了解一下事务。事务: 主要保证数据的一致性,遵循acid原原创 2021-04-23 09:27:28 · 75 阅读 · 0 评论 -
并发编程------volatile原理分析(二)
项目地址JUC_02前面提到了volatile底层锁使用的是MESI缓存一致性协议和总线锁,那么我们也就理解了他的底层实现原理是通过汇编指令lock前缀指令触发到底层锁来实现。前面提到过,volatile不能保证原子性,那为什么不能保证原子性呢?我们来看看代码的解释。为什么volatile不能保证原子性再次之前,我们先了解原子性:即一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。import java.util.ArrayList;/** * @auth原创 2021-04-22 12:50:06 · 92 阅读 · 0 评论 -
并发编程------volatile原理分析(一)
想要了解volatile之前,先去回顾一下多线程,多线程存在的意义?提高我们Http协议响应效率,能够对用户有一个比较好的体验。或者说提高程序的效率。那么怎么理解多核多线程。多核多线程如果是单核的CPU(默认情况下,一核两个线程)情况下,cpu在同一个时刻只能执行一个线程,所以存在切换过程,并不是真正的多线程,所以多核多线程需要的是多核cpu,少量的cpu切换多线程的五个状态创建就绪阻塞运行死亡volatile原理分析什么是 Volatile能够保证线程可见性,当一个线程修改共享变原创 2021-04-20 23:51:58 · 88 阅读 · 2 评论