多线程锁常见面试题

本文探讨了Java虚拟机(JVM)的内存配置,如-Xmx、-Xms、-Xmn和-Xss参数的含义,以及如何调整年轻代、年老代和持久代的比例。同时,提到了多线程锁的相关面试知识点,包括-XX:NewRatio、-XX:SurvivorRatio和-XX:MaxTenuringThreshold等参数对垃圾回收和内存管理的影响。
摘要由CSDN通过智能技术生成
一、volatile
java虚拟机提供的轻量级同步机制:
1.保证可见性  :一个线程修改有volatile修饰的变量,其他线程都能感知最后修改的值
2.不保证原子性
3.禁止命令重排序
解决原子性:添加syns或者使用AtomicInteger
原子性:(不可分割,完整性,某个线程正在做某个具体业务时,中间不可以被加塞或者被分割,需要整体完整,要么同时成功,要么同时失败)
JMM(java内存模型)

总结:所有变量在主内存,所有线程都可以访问,线程操作变量需要把主内存的变量拷贝到工作内存操作,操作完成后写回主内存,并且通知其它线程我已经修改了。

指令重排:

应用场景:
1.单例模式 DCL代码
2.单例模式volatile

JMM:
1.可见性
2.原子性
3.有序性
二、CAS
1.cas是什么?
AtomicInteger 底层:Unsafe类+CAS思想(自旋)

比较并交换   compareAndSet

总结:

缺点:
1.循环时间长,cpu开销大。

2.只能保证一个共享变量得原子操作。
3.ABA问题.   

解决aba方案:
1.原子引用,使用AtomicReference
2.时间戳原子引用或加版本号。AtomicStampeReference
三、集合类
1.ArrayList (线程不安全)
new ArrayList(); 就是创建一个空的数组,初始化长度10,扩容是50%

解决使用:Vector 或者Collections.synchronizedList(new ArrayList<>())或者 CopyOnWirteArrayList<>();
CopyOnWirteArrayList 底层是volatile 修饰的Object[]
add方法源码:

2.SET/HashSet (线程不安全)

也会报错:java.util.ConcurrentModificationException
解决使用:Collections.synchronizedSet(new HashSet<>())或者 CopyOnWirteArraySet<>();
CopyOnWirteArraySet底层:

HashSet底层就是HashMap ,只使用了key,value是一个常量。

3.Map/HashMap (线程不安全)

解决使用:ConcurrentHashMap或者Collections.synchronizedMap(new HashMap<>())
练习题:String str="abc"; 当前str="xxx";的时候相当于new String(); 所以在main方法中打印的还是abc的值

四、公平锁/非公平锁/可重入锁( 递归锁 )/独占锁/共享锁 /自旋锁
1.公平和非公平锁
Lock lock=new ReentrantLock();非公平锁 如果传值如下:
公平锁:多个线程按照申请锁的顺序来获取锁,类似排队打饭,先来后到。
非公平锁:多个线程获取锁的顺序不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁,在高并发的情况下,有可能会造成优先级

反转或者饥饿现象

2.可重入锁(递归锁)

3.自旋锁

4.独占锁(写锁 )/共享锁(读锁)/互斥锁

偏向锁:

轻量级锁:

2偏向锁
大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,偏向锁可以降低多次加锁解锁的开销。
  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值