![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JUC
文章平均质量分 91
dullet
这个作者很懒,什么都没留下…
展开
-
【JUC】并发编程(五)阻塞队列
第一件事将入队节点设置为当前队列尾节点的下一个节点,第二是更新tail节点,如果tai节点的next节点不为空,则入队节点变为tail节点,如果为空,则入队节点设置为tail节点的next节点,所以tail节点并不总是tail节点。:并不是每次出队时都更新head节点,当head节点里有元素时,直接弹出head节点里的元素,而不会更新head节点,当head节点没有元素时,出队才会更新head节点,如图。Thread拿到的是复制的ArrayList,对其进行的操作实在复制的新ArrayList上操作的,..原创 2022-08-05 21:09:01 · 124 阅读 · 0 评论 -
【JUC】并发编程(四) 并发工具类
这时 Thread-0 还停在 594 处,即e=1,next=35,随后Thread-0开始扩容,1先被放入新表,e更新为35,因为此时新的链为(35)->(1)->null,所以next更新为1。因为是线程安全的hashtable,防止其他线程对线程搬迁工作(从后往前)产生影响,在对节点处理完后,会在其对应的下标下加一个ForwardingNode,其他线程访问发现是ForwardingNode,则说明已经处理过了,则不会在对链表做其它操作。随后,1先被放入新表的桶下标1中,接着35被放入新表。....原创 2022-08-05 11:12:44 · 75 阅读 · 0 评论 -
【JUC】并发编程(三)
使用此注解的对象或字段的前后各增加128字节大小的padding,从而让CPU将对象预读至缓存时不用占用不同的缓存行,不会造成对方缓存行为的失效,防止一个缓存行有多个cell对象。一个线程对主存中的一个变量进行修改,另一个线程不可见,因为其是从缓存中读取值的,缓存中的值是开始运行时从主存中读取的未修改前的值。// 将x的值赋值给i。只要其它线程动过了共享变量,如果自己的cas就算失败,这时,仅比较值是不够的,需要再加一个版本号。需要新加两个参数,版本号以及对版本号的修改,如果版本号一致,则返回修改值。...原创 2022-08-04 13:16:03 · 94 阅读 · 0 评论 -
【JUC】并发编程(二)
偏向锁第一次使用CAS时就将线程ID设置到对象头的MaekWord中,之后发现这个线程ID是自己的,就不会重新CAS,以后只要不发生竞争,这个对象就归该线程所有。如果在尝试加轻量级锁过程中,操作无法成功,这时一种情况是其它线程为此对象加上了轻量级锁,这时要进行锁膨胀,将轻量级锁变为重量级锁。当撤销偏向锁阈值超过40次后,jvm会觉得偏向错了,不该偏向,于是整个类的所有对象都变为不可偏向,新建的对象也不可偏向。创建锁记录对象,每个线程的栈帧都会包含一个锁记录的结构,内部可以存储锁定对象的MarkWord。..原创 2022-08-03 12:42:51 · 72 阅读 · 0 评论 -
【JUC】并发编程(一)
启动一个线程,只是进入就绪状态,里面的代码要线程分到时间片时才能执行,每个线程对象的start方法只能调用一次,调用多次会出现异常。打断正常运行的线程,不会清空打断状态(True),线程依然会运行,可以根据打断标记写一段让它停止运行的代码。打断park线程,不会清空打断状态,线程可以继续运行,一旦打断标记为true,再想让它停就不能停下来了。守护线程,只要非守护线程全部结束了,即使守护线程没运行完,整个java进程也会强制结束。多核CPU下,每个核都可以调度运行线程,这时候线程是并行的。...原创 2022-08-03 09:16:10 · 65 阅读 · 0 评论