![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
文章平均质量分 80
Markland_l
这个作者很懒,什么都没留下…
展开
-
并发编程9
保护性暂停模式(Guarded Suspension Design Pattern)某个结果需要在多线程之间传递,则可以让这些线程关联到一个对象 GuardedObject但是如果这个结果需要不断的从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)我们前面前面说的join、future采用的就是这个模式场景介绍#mermaid-svg-8mqif7JC9tNnpuK1 .label{font-family:'trebuchet ms', verdana, arial;fon原创 2021-02-08 02:54:37 · 256 阅读 · 3 评论 -
并发编程8
synchronized关键字的使用和优化synchronized锁消除优化package BingFaBianCheng.bingFaBianCheng8.shadow.test;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.TimeUnit;@Slf4j(topic = "enjoy")public class Test7 { int i=0; public static void原创 2021-02-06 18:31:17 · 201 阅读 · 4 评论 -
阿里面试题多线程打印问题
package bingFaBianCheng17;import java.sql.Connection;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class test8 {static boolean a = false;static boo原创 2021-02-06 16:23:55 · 1279 阅读 · 4 评论 -
并发编程7
锁膨胀过程3偏向锁流程图总结#mermaid-svg-BjqsDvcZxURLc6M1 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-BjqsDvcZxURLc6M1 .label text{fill:#333}#mermaid-svg-BjqsDvcZxURLc6M1 .node rect,#mermai原创 2021-02-04 02:13:10 · 264 阅读 · 0 评论 -
并发编程6
锁的膨胀过程2重偏向不同于锁重入重偏向是第一次偏向锁已经释放了,再一次加偏向锁,就是一个代码块里有两个相邻的synchronized块锁重入就是synchronized里面再套一个synchronized一个线程进入synchronized并退出后对象头的变化轻量锁加锁有个前置的逻辑首先第一个线程获取锁成功后,对象头改为:线程id+101当这个线程执行完退出synchronized块后,对象头改为:000…0001synchronized源码分析并发编程5中用到的openjdk原创 2021-02-02 02:16:43 · 345 阅读 · 2 评论 -
并发编程5
synchronized关键字原理回顾公平锁和非公平锁的区别(acquire方法和tryAcquire方法都不同)区别一:首先非公平锁直接去cas尝试获取锁,如果获取锁失败,再执行非公平锁版的acuqire()方法,而公平锁会直接执行公平锁版的acquire方法如果非公平锁获取锁失败,也就是两者都去执行tryAcquire方法如果c!=0(这把锁没被人持有),后面执行的方法是一样的区别二:如果c==0(这把锁被人持有),多执行了一个hasQueuedPredecessors方法原创 2021-01-31 02:09:45 · 469 阅读 · 1 评论 -
并发编程4
回顾对象头的组成前56bit—在无锁情况下里面存的是hashcode,但是前提是hashcode必须计算57bit—没有使用58-61bit — 分代年龄,从eden区到survivor区,进入老年代,然后+1,一直到1562bit – 是否偏向63、64bit — 锁的级别// 观察对象的分代年龄// 设置jvm的大小 --- -Xmx200mpackage BingFaBianCheng.bingFaBianCheng4.test;import BingFaBianCh原创 2021-01-30 17:19:48 · 172 阅读 · 0 评论 -
并发编程2
多线程锁的os内核理解os同步的方式(操作系统级别的锁)1.互斥量(mutex)pthread_Mutex_t(互斥锁)发生竞争的时候如果拿不到锁则睡眠2.自旋锁(spinlock)pthread_spin_t(自旋锁)—拿不到锁不会睡眠,而是一直空转,由操作系统控制大部分面试时问到的自旋锁不是指spinlock,而是jvm内部对于线程的控制,维度不同while(!cas(xx,xx,xx)){// 一直自旋}return;3.信号量sysnc原创 2021-01-27 21:51:26 · 101 阅读 · 0 评论 -
并发编程3
并发编程之synchronized同步多线程造成的计算错误—线程切换package BingFaBianCheng.bingFaBianCheng3.test;import BingFaBianCheng.bingFaBianCheng3.entity.L;import BingFaBianCheng.bingFaBianCheng3.util.CASLock;import lombok.extern.slf4j.Slf4j;@Slf4j(topic = "enjoy")public原创 2021-01-29 02:18:44 · 182 阅读 · 1 评论 -
并发编程1
并发编程1编译openjdk源码怎么看这个方法,在github上下载open jdk方法为什么下的是jdk11,编译jdk11必须要有jdk8的代码(编译jdk源码,必须在目录下有一个比它版本低的jdk源码)native方法是通过JNI方法调用的,对应于一个c语言方法,hotspot大部分基础功能都通过openjdk开源了java中的线程和操作系统的线程是什么关系java线程的本质start方法启动后,调用软方法run()start()源码的线程控制原语start0()是原创 2021-01-22 04:16:53 · 157 阅读 · 0 评论 -
并发编程20
并发编程20回顾指令重排的原理// 场景:在多核CPU下,a被缓存到core2下面// core1首先把a=1执行完,然后放到store buffer中// // 修改变量a,异步通知core2,a=1;// load变量a,此时可能是0,导致b是一个错误的值b=a+1;if(b==1){ doSomething();}core1首先把a=1执行完,core1 core2 |原创 2021-01-21 04:37:48 · 207 阅读 · 2 评论 -
并发编程19
并发编程19HashMap掌握map首先要掌握list的原理ArrayList源码add方法,首先判断是否装满,装满了,则扩容,没装满则直接添加,实际就是操作数组LinkedList源码比ArrayList要复杂,是以链表实现的,每一个节点都是一个Node类,是双向链表class Node<T>{ Node pre; T t; Node next;}add方法首先创建Node对象,如果头节点是空的,则设置头节点,同时尾节点也是添原创 2021-01-20 04:11:07 · 157 阅读 · 0 评论 -
并发编程18
并发编程18synchronized和lock选哪个性能几乎一样,但是sync是内置锁,由jdk组件的源码可知,sync性能要高于reentrantlock,但是这个高可以忽略1.6之前 lock高于sync1.8之后 concurrenthashmap改成了用sync来实现但是从功能上来说,需要看情况,1、lock是可中断的(人为中断—lockInterrupted、超时中断)2、多条件wait(await)3、公平锁和非公平锁,sync是非公平锁4、lock也支持读写原创 2021-01-15 02:59:08 · 154 阅读 · 2 评论 -
并发编程17
并发编程17关于CPU 内存CPU(寄存器、缓存)、内存(内存条)、I/O 设备(磁盘、键盘、鼠标)都在不断迭代,在这个快速发展的过程中,有一个核心矛盾一直存在,就是这三者的速度差异。CPU 和内存的速度差异可以形象地描述为:CPU快于内存快于 I/O 设备,程序里大部分语句都要访问内存,有些还要访问 I/O所以程序整体的性能取决于最慢的操作——读写 I/O 设备,也就是说单方面提高 CPU 性能是无效的。为了合理利用 CPU 的高性能,平衡这三者的速度差异,计算机体系结构、操作系统、编译程序都做出了贡原创 2021-01-07 01:49:22 · 132 阅读 · 0 评论 -
并发编程16
并发编程16ThreadPoolExcutor源码关闭线程池shutdown()public void shutdown() { final ReentrantLock mainLock = this.mainLock; mainLock.lock(); try { // 是否允许shutdown checkShutdownAccess(); // 设置成shutdown状态原创 2021-01-03 15:09:20 · 159 阅读 · 0 评论 -
并发编程15
并发编程15jdk内部线程池ExecutorServiceThreadPoolExecutorScheduledExecutorService线程池状态ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态,低 29 位表示线程数量状态value说明RUNNING(当线程池创建出来的初始状态)111能接受任务,能执行阻塞任务SHUTDOWN(调用shutdown方法)000不接受新任务,能执行阻塞任务 肯定可以 執行正在執原创 2021-01-01 20:00:54 · 171 阅读 · 0 评论 -
并发编程14
并发编程14定义一个线程池package BingFaBianCheng.bingFaBianCheng14.poolv1;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * @Author 钢牌讲师--子路 **/@Slf4j(topic = "e")public class TestPo原创 2020-12-18 02:47:07 · 94 阅读 · 0 评论 -
并发编程13
并发编程13高性能读写锁StampedLock(jdk内部的)ReentrantReadWriteLock 的性能已经很好了但是他底层还是需要进行一系列的cas操作去加锁;StampedLock如果是读锁上锁是没有这种cas操作的性能比ReentrantReadWriteLock 更好也称为乐观读锁;即读获取锁的时候 是不加锁 直接返回一个值;然后执行临界区的时候去验证这个值是否有被人修改(写操作加锁)如果没有被人修改则直接执行临界区的代码;如果被人修改了则需要升级为读写锁(Reentrant原创 2020-12-17 02:13:39 · 190 阅读 · 0 评论 -
并发编程12
并发编程12–ReentrantLock解锁流程和读写锁源码{w thread=t1} ^ | V{r thread=t2 ws=-1} <-> {shared thread=null prev=null next=null}// 比普通独占锁中的节点多了shared属性,下一个节点是shared继续唤醒,直到遇到exclusive ^ | V{r thread=t3 ws=-1} <-> {share原创 2020-12-15 01:04:13 · 141 阅读 · 0 评论 -
并发编程11
并发编程11t1释放锁之后,唤醒t2线程,t2线程从LockSupport.park()处唤醒,继续往下执行Thread.interrupted()并不是打断线程,只是清除打断标记线程打断sleep、wait、join这种线程如果被打断则会直接清除打断标记 --> 什么是打断标记1.怎么看打断标记? Thread.interrupted()2.打断标记是标记自己这个线程是否被别人打断过了例子1—sleep线程打断package BingFaBianCheng.bin原创 2020-12-12 02:08:41 · 178 阅读 · 1 评论 -
并发编程10
并发编程10读写锁读读并发package BingFaBianCheng.DuXieSuo;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantReadWriteLock;@Slf4j(topic = "enjoy")publi原创 2020-12-11 00:13:27 · 247 阅读 · 0 评论 -
并发编程学习笔记12----ReentrantReadWriteLock读写锁源码
ReentrantLock解锁流程和读写锁源码回顾读读并发、读写互斥,写写互斥,如果是读锁,一直会往后面叫醒ReentrantLock 读写锁的原理ReentrantReadWriteLock来获取读写锁ReadLock、WriteLock写锁上锁流程tryAcquire()同样是获取aqs中的state,默认是0w = exclusiveCount©,由于读写锁用的是同一把锁,同一个变量,为了标识,把前十六位标识成读锁状态,后十六位标识写锁SHARED (Reentra原创 2020-09-17 22:18:26 · 99 阅读 · 0 评论 -
手写ReentantLock
主要是仿照jdk1.8的ReentantLock进行的仿写,将自己的理解逻辑写成注解批注在上面,主要是集中在加锁过程,后面的一些park和cancelAcquire没有仔细分析。欢迎批评交流。public class MockLock { /** * 简化版公平锁 */ static class Sync extends AbstractQueueSynchronizer{ void lock(){ // 1是加锁的目标状态原创 2020-08-30 12:07:28 · 89 阅读 · 0 评论