并发
文章平均质量分 78
肥春勿扰
这个作者很懒,什么都没留下…
展开
-
并发容器11
JDK 提供的这些容器大部分在包中。线程安全的 HashMap线程安全的 List,在读多写少的场合性能非常好,远远好于 Vector.高效的并发队列,使用链表实现。可以看做一个线程安全的 LinkedList,这是一个非阻塞队列。这是一个接口,JDK 内部通过链表、数组等方式实现了这个接口。表示阻塞队列,非常适合用于作为数据共享的通道。跳表的实现。这是一个 Map,使用跳表的数据结构进行快速查找。在很多应用场景中,读操作可能会远远大于写操作。原创 2023-08-30 17:49:50 · 434 阅读 · 0 评论 -
CountDownLatch和CyclicBarrie
什么是闭锁对象闭锁对象(Latch Object)是一种同步工具,用于控制线程的等待和执行顺序。闭锁对象可以让一个或多个线程等待,直到特定的条件满足后才能继续执行。在Java中,CountDownLatch就是一种常见的闭锁对象。它通过一个计数器来实现线程的等待。计数器的初始值设定为一个正整数,表示需要等待的事件数量。当一个线程完成了一个事件时,计数器的值就会减1。当计数器的值变为0时,所有等待的线程都会被释放,继续执行后续的操作。闭锁对象的主要特点是,一旦计数器的值变为0,就不能再重新设置或重用。原创 2023-08-20 18:42:53 · 389 阅读 · 1 评论 -
深入AQS原理(我在一开始学的时候就把非公平锁和公平锁给弄混了)
谈到并发,我们不得不说,所谓的AQS即是抽象的队列式的同步器,内部定义了很多锁相关的方法,我们熟知的Semaphore等都是基于AQS来实现的。我们先看下AQS相关的UML图:在下面自己整理出一张AQS的框架图,供大家参考。原创 2023-08-20 17:14:39 · 485 阅读 · 2 评论 -
thread 的join方法
我们可以看出:是test02线程在调用 join() -> wait(), 所以test02会进入WAITING状态。直到test01执行完,自动调用Thread.exist()方法,在exist()方法中,test02会被唤醒。重要的是test02的状态,调用join方法后,test02变成了WAITING状态,为什么?join方法加了锁,锁的是谁?test01,谁持有锁?两个红色的框分别说明了sleep方法前后test01的状态,这个不是重点,只是一个验证而已。原创 2023-08-14 09:58:57 · 92 阅读 · 0 评论 -
sleep和wait
wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是 thisOBJ.wait(),这里的暂停是阻塞,thisOBJ就好比一个监督我的人站在我旁边,本来该线 程应该执行1后执行2,再执行3,而在2处被那个对象喊暂停,那么我就会一直等在这里而不执行3,但正个流程并没有结束,我一直想去煮饭,但还没被允许, 直到那个对象在某个地方说"通知暂停的线程启动!都用来进行线程控制,他们最大本质的区别是:sleep()不释放。,wait()释放同步锁.;原创 2023-08-13 23:44:24 · 105 阅读 · 0 评论 -
区分等待、阻塞,加拓展
一切回归原始:假设一个场景:多个线程任务执行在同一个单核cpu上,在我们获取临界资源的时候,为了线程安全,是要加锁的,假设锁是synchronized,那么同一时刻,只有一个线程任务能获取锁资源,那么其它的线程就进入了:blocked状态,等待获取锁的状态,如上代码BLOCKED, 此时,这些没有获取到锁的线程有一些条件:1:他们都是可以随时被CPU上下文切换获取到执行权的。,为什么没有挂起状态,因为线程挂起这种操作已经过时,不建议使用了,这里不做过多讨论,有人愿意研究的,请自行搜索:线程挂起。原创 2023-08-13 23:44:10 · 80 阅读 · 0 评论 -
线程转换状态,傻傻分不清等待和阻塞吗?你还在暴力的停止线程吗?
线程创建之后,调用start()方法开始运行。当线程执行wait()方法之后,线程进入等待状态。进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态,而超时等待状态相当于在等待状态的基础上增加了超时限制,也就是超时时间到达时将会返回到运行状态。当线程调用同步方法时,在没有获取到锁的情况下,线程将会进入到阻塞状态。线程在执行Runnable的run()方法之后将会进入到终止状态。Java将操作系统中的运行和就绪两个状态合并称为运行状态。阻塞状态是线程。原创 2023-08-13 20:38:16 · 1562 阅读 · 2 评论 -
java的内存模型
Java线程之间的通信由Java内存模型(本文简称为JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。如果线程A与线程B之间要通信的话,必须要经历下面2个步骤。原创 2023-08-13 13:29:45 · 107 阅读 · 0 评论 -
Synchronized同步锁的优化方法 待完工
在JDK1.5 之前,Java 是依靠 Synchronized 关键字实现锁功能来做到这点的。Synchronized 是 JVM 实现的一种内置锁,锁的获取和释放是由 JVM 隐式实现。到了 JDK1.5 版本,并发包中新增了来实现锁功能,它提供了与 Synchronized关键字类似的同步功能,只是在使用时需要显示获取和释放锁Lock 同步锁是基于 Java 实现的,而 Synchronized 是基于底层操作系统的 Mutex Lock。原创 2023-08-07 22:59:27 · 155 阅读 · 0 评论