失效链接处理 |
2021 java面试题 PDF 下载
本站整理下载:
相关截图:
主要内容:
2021面试题
1、volatile 轻量级的同步模型
可见性、不保证原子性、禁止指令重排序
多线程环境中可以用volatile避免指令重排
相当于内存屏障,指令前后cpu不能重排,刷出cpu缓存
cpu指令 storestore+storeload\loadload
使用场景:
最适用一个线程写,多个线程读的
单例private volatile static Singleton instace;不然容易出现指令重排,会有安全隐患
if(instance==null){
sychrized(class){
if(instance==null){
new instance();//不加volatile可能出现指令重排
}
}
|
new对象,分3步,分配内存,初始化对象,设置指针
指令重排只保证单线程串行安全
您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:
对变量的写操作不依赖于当前值。
该变量没有包含在具有其他变量的不变式中
2\
jmm java内存模型可见,原子,有序
3、cas
compareAndSet第一个是期望已经的值和真实值一样,那么修改为 第二个参数是打算修改成的值。
4、unsafe
native 、rt.jar
cas CPU并发原语,CPU原子指令,底层汇编
5、atomicInteger getAndINcrement
依靠cas指令原语,先主内存拷贝到程序内存,再比较cas 跟期望是否一致,一样的话,就设置值。否则循环继续循环。
6、
cas没用锁,synchrinized加锁了
cas思想,自旋
7、cas缺点
循环时间长,开销大;
只能保证一个共享遍历的原子操作
引出来ABA问题
8、ABA问题解决?
原子引用更新AtomicReference比较的是对象的地址
AtomicStampReference
9\arraylist1.2
初始化object[]空数组,扩容原来的一半
add没加锁,所以多线程concurrentmodificationException
vector1.0 add有锁synchroized
Collections.synchroziedList();
CopyOnWriteArrayList 高并发变量都需要volatile
ReentrantLock lock.lock() unlock()
HashSet->Collections.synchronizedSet->CopyOnWriteArraySet
CopyOnWriteArraySet使用CopyOnWriteArrayList
HashSet底层就是hashmap 16,0.75,add是map put(e,object())
ConcurrentHashMap
String str传参数时,不改变原有值
ReentrantLock默认非公平锁
公平锁按申请顺序获取锁
非公平锁有可能造成优先级翻转或者饥饿,有点吞吐量大
synchronized非公平锁
可重入锁也就递归锁,非公平 比如ReentrantLock synchronized,一个线程获得锁后,内层函数仍然获取该锁,外层已经有所后,内层自动获取锁,是同一把锁。作用防止死锁。
ReentrantLock 2个lock,2个unlock时 运行正常
|