![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发
C位出道_2022
这个作者很懒,什么都没留下…
展开
-
ConcurrentHashMap 浅析
一、ConcurrentHashMap 1.7ConcurrentHashMap作为线程安全的HashMap不管是面试率还是使用率都是很高的,那么ConcurrentHashMap是怎样的结构以及源代码如何实现的呢?我们先从ConcurrentHashMap1.7开始分析1.存储结构Java 7 中 ConcurrentHashMap 的存储结构如上图,ConcurrnetHashMap 由很多个 Segment 组合,如果你了解 HashMap 的源码结构会发现每一个 Segme.原创 2022-02-11 21:17:24 · 1075 阅读 · 0 评论 -
AQS原理浅析
听过很多人在面试的时候会问到并发知识,很多时候经常会问"请你说一下自己对于AQS原理的理解",AQS全称AbstractQueuedSynchronizer ,是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的 ReentrantLock,Semaphore,其他的诸如 ReentrantReadWriteLock,SynchronousQueue,FutureTask(jdk1.7) 等等皆是基于 AQS 的。当然,我们自己也能利用 AQS 非..原创 2022-02-10 20:22:19 · 168 阅读 · 0 评论 -
死锁demo分析
在学操作系统课程的时候第一次接触到死锁的概念死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。在看java并发编程这本书的时候又看到了一个死锁的例子很好的例子分享一下public class DeadLockDemo { private static String A = "A"; private static Str原创 2022-01-29 00:24:36 · 199 阅读 · 0 评论 -
java锁机制小总结
马上春招了,总结一下锁机制,看了好多博客学到了很多,自己在总结一下我们常常听到的锁相关名词有一下几种公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁下面一 一展开概念解释一、 公平锁/非公平锁1.公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。优点:所有的线程都能得到资源,不会出现线程饿死在队列中。缺点:吞吐量会下降很多,永远先获得资源的都是原创 2022-01-25 19:48:01 · 210 阅读 · 0 评论 -
简述线程池的处理流程及工作原理
线程池内部是通过队列+线程实现的,当我们利用线程池执行任务的时候:1.如果此时线程池中线程的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。2.如果此时线程池中线程的数量等于corePoolSize,但是缓冲队列workQueue未满,那么任务被放进缓冲队列。3.如果此时线程池中线程的数量大于等于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,新建的线程来处理被添加的任务。..原创 2021-10-04 15:24:16 · 1022 阅读 · 0 评论 -
对线程安全的理解
与其说线程安全不如说是内存安全。堆是共享内存可以被所有线程访问。当多个线程访问一个对象时,如果不用进行额外的同步控制或其他的协调操作,调用这个对象的行为都能获得正确的结果,我们就说这个对象是线程安全的(正确的结果可以理解为预期的结果或者单线程执行的结果)堆是进程和线程的共有空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是用完了要还给操作系统,要不然就是内存泄漏。在java中,.原创 2021-10-04 15:11:33 · 85 阅读 · 0 评论 -
线程之间是怎么进行通讯的
1.线程之间可以通过共享内存或基于网络来进行通讯。2.如果是通过共享内存来进行通讯,则需要考虑并发问题,什么时候阻塞什么时候唤醒3.像java中的wait()、notify()就是阻塞和唤醒4.通过网络就比较简单了,通过网络连接将通信数据发送给对方,当然也要考虑并发问题,处理方式就是加锁等方式...原创 2021-10-04 14:50:54 · 2304 阅读 · 0 评论 -
并发、并行、串行的区别
串行在时间上不可能发生重叠,前一个任务没搞定,下一个任务就等着并行在时间上是重叠的,两个任务在同一时刻互不干扰的同时执行并发允许两个任务彼此干扰。统一时间点、只有一个任务运行,交替执行(对于cpu而言也是串行的)...原创 2021-10-04 14:46:13 · 184 阅读 · 0 评论 -
Sychronized和ReentrantLock的区别
1.Sychronized是一个关键字,ReentrantLock是一个类2.Sychronized会自动的加锁和释放锁,ReentrantLock需要程序员手动的加锁和释放锁3.Sychronized底层是JVM层面的锁,ReentrantLock是API层面的锁4.Sychronized是非公平锁,ReentrantLock可以选择公平锁或非公平锁5.Sychronized锁的是对象,锁信息保存在对象头中,ReentrantLock通过代码中的int类型的state标识来标识锁的状态原创 2021-10-04 14:38:03 · 681 阅读 · 0 评论 -
Sychronized的偏向锁、轻量级锁、重量级锁
1.偏向锁:在锁对象的对象头中记录一下当前获取到该锁的线程ID,该线程下次如果又来获取该锁就可以直接获取到了。2.轻量级锁:由偏向锁升级而来,当一个线程获取到锁后,此时这把锁是偏向锁,此时如果有第二个线程来竞争锁,偏向锁就会升级为轻量级锁,之所以叫轻量级锁,是为了和重量级锁分开,轻量级锁的底层是通过自旋来实现的,并不会阻塞线程。3.如果自旋次数过多仍然没有获取到锁,则会升级为重量级锁,重量级锁会导致线程阻塞。4.自旋锁:自旋就是线程在获取锁的过程当中,不回去阻塞线程,也就无所谓唤醒线程,阻塞和唤原创 2021-10-04 14:31:20 · 303 阅读 · 0 评论 -
ThreadLocal的原理和使用场景
每一个Thread对象均含有一个ThreadLocalMap类型的成员变量threadLocals,它存储本线程中所有ThreadLocal对象及其对应的值ThreadLocalMap由一个个Entry对象构成Entry继承自WeakReference<ThreadLocal<?>>,一个Entry由ThreadLocal对象和Object构成。由此可见Entry的key是ThreadLocal对象并且是一个弱引用。当没有指向key的强引用之后该key就会被垃圾收集器回收原创 2021-10-03 17:00:01 · 304 阅读 · 0 评论 -
ReentrantLock中tryLock()和Lock()方法的区别
ReentrantLock:Lock():阻塞加锁,无返回值,如果该线程没有获得锁就阻塞,直到获得锁放开tryLock():尝试枷锁,布尔类型返回值,线程有锁返回true,反之返回false,不会阻塞利用tryLock()可以有自旋锁,自旋锁对cpu消耗较大,但是性能要优于lock()方法...原创 2021-10-03 16:13:47 · 2052 阅读 · 0 评论 -
CountDownLatch和Semaphore的区别和底层原理
CountDownLatch:表示计数器,可以给CountDownLatch设置一个数字,一个线程调用CountDownLatch的await()将会阻塞,其他线程调用CountDownLatch的countDown()方法来对CountDownLatch中的数字减一,当数字被减成0后,所有的await线程将被唤醒。对应的底层原理就是,调用await()方法的线程会利用AQS队列,一旦数字被减为0,则会将AQS中正在排队的线程依次唤醒线程1调用了await()方法会造成阻塞,但是线程2,3,4.原创 2021-10-02 14:36:46 · 722 阅读 · 4 评论