
并发编程
文章平均质量分 73
sicaujh
这个作者很懒,什么都没留下…
展开
-
CopyOnWriteArrayList学习笔记
前言并发包中的并发List只有CopyOnWriteArrayList。CopyOnArrayList是一个线程安全的ArrayList,对其进行修改的操作都是在底层的一个复制的数组上进行的,也就是使用了写时复制策略。CopyOnWriteArrayList源码解析初始化public CopyOnWriteArrayList() { setArray(new Object[0]); }无参构造函数内部创建了一个大小为0的Object数组作为array的初始值。然后看下有参...转载 2021-03-01 14:50:21 · 170 阅读 · 0 评论 -
Java并发编程:线程各种状态之间的转换
BLOCKED,WAITING,TIMED_WAITING的区别请看另外一篇帖子:https://blog.youkuaiyun.com/qq_41834553/article/details/1126261661、NEW←→RUNNABLE当调用t.start()方法时,会由NEW→RUNNABLE2、RUNNABLE←→WAITING当调用obj.wait()方法时,t线程会从RUNNABLE→WAITING当调用obj.notify()/obj.notifyall()/t.in...原创 2021-01-14 19:01:00 · 125 阅读 · 0 评论 -
Java并发编程:BLOCKED,WAITING,TIMED_WAITING区别
一、介绍BLOCKED,WAITING和TIMED_WAITING是很重要的线程状态,但是经常对我们造成困扰。如果需要分析线程dump必须要对其有一定的理解。使用生活的例子,本文将每个状态变成了简单的例子。与正式的Java文档定义相比,任何让人费解的概念都可以用简单的例子来理解。如果用真实生活中的例子,就更好理解了。我想分享一些真实生活的例子来帮助理解这些线程状态。二、BLOCKEDJava文档官方定义BLOCKED状态是:“这种状态是指一个阻塞线程在等待monitor锁。”真实生.转载 2021-01-14 18:23:00 · 1016 阅读 · 0 评论 -
Java并发编程:浅谈park/unpark机制
park/unpark是LockSurpport类中的方法,其基本使用为://暂停当前线程LockSupport.park();//恢复某个线程的运行/LockSupport.unpark(暂停线程对象);每个线程都有自己的一个parker对象,这个parker对象由_counter,_cond(条件变量),_mutex三部分组成。举个例子:一个线程就像一台小时候路边杂货店门口需要投币的游戏机,不过这台游戏机比较特殊,无论投多少个游戏币进去只算投进去一个,并且没有游戏币后会马上关机原创 2021-01-14 15:07:52 · 1555 阅读 · 0 评论 -
Java并发编程:浅谈wait/notify/notifyall机制
1、使用条件:当前重量级锁的持有线程Thread2发现条件不满足时会调用wait方法,Thread2释放锁并进入WaitSet变为WAITING状态(即线程调用wait/notify/notifyall方法的前提条件是该线程必须持有这个锁)。2、线程在BLOCKED和WAITING状态下都是处于阻塞状态,不会占用CPU时间片。3、当Owner线程释放锁的时候,会调用notify或者notifyall来唤醒WaitList中的线程进入EntryList重新竞争锁,区别在于notify是随机唤醒一个原创 2021-01-14 11:09:38 · 209 阅读 · 0 评论 -
Java并发编程:浅谈偏向锁、轻量级锁、自旋优化、锁膨胀、锁重入机制
一、介绍1、 我们知道,在java中可以通过Synchronized对对象加锁、其原理是通过对对象内部的一个叫做监视器(monitor)的来实现的,但是线程之间的切换是需要操作系统通过从用户态转成核心态来实现的,状态之间的转换需要比较长的时间,这就是为什么synchronized效率比较低的原因。Java从JDK6开始引入了“轻量级锁”和“偏向锁”来减少频繁的锁释放和锁获得所带来的性能上的消耗,所以在jdk6中,锁一共有4种状态:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。这些锁会随着...原创 2021-01-13 20:30:41 · 270 阅读 · 0 评论