Java多线程⑤----并发知识点笔记

多线程文章目录

下面这部分知识在面试中可能会用到,同时了解这些只有有助于我们写出高并发的代码;同时欢迎和我探讨。

我只是简单的列出部分知识和概念,详细情况可以读我放出的博客链接。

对象内存布局

https://www.cnblogs.com/zhengbin/p/6490953.html

包括三部分:对象头、实例数据和对齐填充

对象头: 总共占12个字节,前8个字节是mark world (0-4 4-8) ;哈希码(HashCode)、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳、对象分代年龄

后4个字节,是指向class的指针;64位实际上占用8字节,但是默认启用指针压缩;

12个字节不满足8的倍数、对齐补充4个字节

逃逸分析 --编译器JIT

https://blog.csdn.net/w372426096/article/details/80938788

扫描二维码关注公众号,回复: 11271266 查看本文章

同步关键字 synchonized

cas lock cmpxchg

https://www.cnblogs.com/ljl150/p/12514198.html

1、字节码层面 monitorenter moniterexit

2、jvm执行过程中 偏向锁(无锁)----> 自旋锁(cas) ----> 重量锁(互斥信号)

自旋更新锁记录Lock Record采用cas方式;1.6以后加入自适应自旋锁

3、汇编层(cpu指令)实现 lock cmpxchg

访问大对象,超过64kb的,锁总线,效率低;不然使用cpu的一致性实现、如MESI;

https://blog.csdn.net/qq_35642036/article/details/82801708 总线锁、缓存是、MESI

重量锁 涉及到内核态到用户态的切换;锁记录指向互斥量 lock mutex

依赖于底层的操作系统的Mutex Lock;而操作系统实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高,这也是为什么早期的synchronized效率低的原因

wait/notify必须在同步代码块中执行,用于生成monitorenter 和 monitorexit指令

关键字Voliatile

1、线程可见性

2、指令重排序 ---cpu乱序执行

1、验证代码

2、DCL(双重检查问题)问题、半初始化对象、使用对象出现问题

指令重排原理:

1、voliatlie可见性

2、JVM层面内存屏障,相关规范

3、CPU层面lock、锁总线(有相关指令操作,考虑一致性问题和同步一样用锁)

Java引用

http://blog.csdn.net/l540675759/article/details/73733763 参考博客

强引用  正常的new对象

软引用  SoftReference 内存不足就回收;应用场景 缓存

和引用队列一起使用,如果被回收会放到引用队列,被感知

#举例,除了虚引用都是类似的用法
SoftReference reference = new SoftReference(obj, queue);

弱引用 WeakReference 弱引用的对象拥有更短的生命周期,只要垃圾回收器扫描到它,不管内存空间充足与否,都会回收它的内存。

一次性场景:ThreadLocal场景;Spring transaction的connnection;

同样可以和引用队列一起使用

虚引用 PhantomReference;堆外内存标记方便回收 应用场景 堆外内存;NIO

必须和引用队列关联 :

当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之关联的引用队列中。

(1)单条引用路径可及性判断:
在这条路径中,最弱的一个引用决定对象的可及性。
(2)多条引用路径可及性判断:
几条路径中,最强的一条的引用决定对象的可及性    

ThreadLocal

https://www.jianshu.com/p/a1cd61fa22da

1、主线程 threadLocal、线程1使用threadLocal添加值,实际上添加到当前线程的ThreadLocal.ThreadLocalMap里面;线程2亦如是;

2、ThreadLocal使用entry使用弱引用存放key(即ThreadLocal),使用弱引用,方便gc回收ThreadLocal对象,不然无法回收,内存泄漏;但是map中的value对象依然无法释放,会有内存泄漏;使用后,记得reomve key不然会有内存泄漏,remove会将key值为空的也删掉

public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
}
//ThreadLocal<?> key, Object value

应用场景:Spring transaction的connnection;;WeakHashMap

在Java集合中有一种特殊的Map类型即WeakHashMap,在这种Map中存放了键对象的弱引用,当一个键对象被垃圾回收器回收时,那么相应的值对象的引用会从Map中删除. WeakHashMap能够节约储存空间,可用来缓存那些非必须存在的数据. WeakHashMap的访问操作这时候才进行对键对象的垃圾回收清理.

猜你喜欢

转载自blog.csdn.net/Zzhou1990/article/details/106170530