
java并发编程
文章平均质量分 95
java并发编程学习
Integer_Double
这个作者很懒,什么都没留下…
展开
-
java并发编程学习八——ReentrantLock原理
基于AQS自定义实现一个不可重入的独占锁try {try {try {再次加锁,当前线程被阻塞 System . out . println(Thread . currentThread() . getName());} /*** 独占锁,不可重入//上锁之后,设置锁的所有者为当前线程 setExclusiveOwnerThread(Thread . currentThread());System . out . println("成功加锁");原创 2022-10-28 15:12:00 · 757 阅读 · 0 评论 -
java并发编程学习七——线程池
模拟实现线程池原创 2022-10-10 14:37:32 · 394 阅读 · 0 评论 -
java并发编程学习六——乐观锁CAS
CAS必须借助volatile才能读到共享变量的最新值,从而完成【比较-交换】的效果,来看看AtomicInteger的源码,其中初始值value就是用volatile修饰的。原子累加器,指的是累加操作是原子的,java8之前只能使用原子整数类的incrementAndGet方法,java8新增了LongAdder(并发大神狗哥,Doug Lea编写),专门用于累加操作,效率提升5倍。,当竞争激烈的时候,累加分散到多个cell减少失败重试,最后将结果汇总,最终减少竞争提高效率。给withdraw加锁即可。原创 2022-09-22 14:54:12 · 681 阅读 · 0 评论 -
java并发编程学习五——volatile
但是,Java的volatile在实现层面用的不是fence族屏障,而是lock。lock锁用来控制cpu对一个内存区域的访问权限,具体的这里不再深入讨论。他们都能达到内存屏障的效果,在字节码指令层面可以这样理解:- 对volatile变量的写指令后会加入写屏障- 对volatile变量的读指令前会加入读屏障原创 2022-09-13 15:13:40 · 318 阅读 · 0 评论 -
java并发编程学习四——ReentrantLock使用
可中断意思是,在获取lock失败之后,线程进入lock的阻塞队列,再调用了线程的interrupt方法之后,线程将被中断,不再阻塞并抛出异常InterruptedException。使用ReentrantLock的tryLock(n,TimeUnit)方法,可以设定等待锁的时间,等待期间也可以被interrupt方法打断。看示例代码,t1线程要先睡觉再工作,t2线程要先工作再睡觉就发生了死锁。三个线程t1/t2/t3,t1输出五次a,t2输出5次b,t3输出5次c;执行的结果,程序不能正常退出。原创 2022-09-05 14:07:22 · 487 阅读 · 0 评论 -
java并发编程学习三——wait/notify与park/unpark
wait/notify与park/unpark原创 2022-08-24 11:34:01 · 506 阅读 · 1 评论 -
java并发编程学习二——synchronized
每个java对象都可以关联一个Monitor对象,当对象被synchronized(obj)加锁(重量级)之后,对象头中的Mark Word会记录指向Monitor对象的指针,即上图中的ptr_to_heavyweight_monitor。那么什么是轻量级锁呢,轻量级锁是相对于原来使用操作系统互斥量来实现的传统锁而言的,所以才有轻重的区别。下面看下轻量级锁的实现过程。锁膨胀或者叫锁升级,指的是在CAS操作尝试加轻量级锁时失败,说明已经有其他线程加上了轻量级锁(发生了竞争),将轻量级锁变为重量级。......原创 2022-08-18 16:31:48 · 260 阅读 · 0 评论 -
java并发编程学习一——Thread
Java语言中,在Thread类定义了一个状态枚举,表示线程的状态,有以下六种:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。如图所示:开始和终止状态一样的,java中将就绪和运行合并为可运行,将阻塞细分为阻塞、等待和超时等待。值得注意的是,操作系统中一部分阻塞,在java中认为是可运行状态,例如IO阻塞。setDaemon将设置线程为守护线程,顾名思义守护其他线程的线程,当没有线程需要守护,自己就强制结束了。加判断让t1线程停止运行。...原创 2022-08-12 11:57:47 · 241 阅读 · 0 评论