首页 > 编程语言 > 详细

阳哥:juc多线程及高并发

时间:2021-03-28 11:12:17      阅读:61      评论:0      收藏:0      [点我收藏+]

1. volatile

volatile int

轻量级的同步机制
三大特性:保证可见性 || 不保证原子性(一个线程做 不能被加塞,同时成功/失败) || 禁止指令重排
要保证原子性 就 加 1.volatile 2.synchronize int() /// AtomicInteger .getAndIncrement
指令重排:
技术分享图片
禁止指令重排,是加了内存屏障,CPU指令:1.保证执行顺序 其前后都不能换 2.保证可见性

volatile 写操作:storestore屏障 StoreLoad屏障
volatile 读操作:loadload屏障 loadStore屏障

jmm内存模型

他是一个规范,不是真实是存在的
java内存模型 规定所有的变量都在 主内存 是共享内存空间
jvm运行实体是线程,线程的工作内存是 私有数据区域
线程把 主内存的变量数据 拷贝到工作内存,完事 在放回主内存 更新上。

jmm的三个特性:1.可见性 || 2.原子性 || 3.有序性《相当于了禁止指令重排》

代码:
代码1 可见性:构造一个Thread让他sleep 并改了,main就拿不到改的
代码2 原子性:number++,开20个线程,每个添加1000回,最后不是20000个,,需要1.volatile int number 2. synchronize int() /// AtomicInteger .getAndIncrement

DCL双端检锁机制 线程不安全

sychronized前判断instance==null,后也加上
他做的是 1.分配对象内存空间//2.初始化对象//3.instance指向分配的内存地址。
因为指令重排。

3. 用到volatile的地方:

3.1单例模式 : volatile 类名instance + DCL双端检索机制

技术分享图片

3.2 读写锁 手写缓存的时候

3.3 CAS底层也是

2. CAS

比较并交换Compare-And-Swap
CPU并发原语。是硬件的,就是原子性的。

自旋锁和unsafe类

unsafe

rt.jar sun.misc.unsafe

CAS保证线程安全 靠的是 unsafe类

unsafe类里都是native方法,unsafe可以直接操作 特定内存数据
unsafe unsafe.getAndAddInt() 传一个内存偏移地址,里面有个do-while,根据jmm内存模型 直到工作内存跟主内存的值一样,才退出循环,,,自旋。

value用volatile修饰保证可见性。

AtomicInteger里面 是 UNsafe+CAS

3. 原子类AtomicInteger的ABA问题,原子引用更新

AtomicInteger里面 是 UNsafe+CAS

compareAndSet

4. ArrayList number++ 线程不安全

5. 公平锁/非公平锁/可重入锁/递归锁/自旋锁

6. CountDownLatch/CyclicBarrier/Semaphore

7. 阻塞队列

8. 线程池 ThreadPoolExecutor

9. 线程池 设置合理参数

10. 死锁编码 & 定位分析

11. java锁

阳哥:juc多线程及高并发

原文:https://www.cnblogs.com/ming-michelle/p/14587386.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!