Java基础和JUC常见问题
Posted 若甘年后
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础和JUC常见问题相关的知识,希望对你有一定的参考价值。
Java基础和JUC
1. valotile关键字
原因:之所以出现是因为cpu级别的缓存和总线锁导致的数据可见性问题以及指令重排序问题
作用:valotile的作用是可以禁止指令重排序以及实现可见性,但并不是线程安全的,因为不具有原子性
可见性是如何实现的了?
操作系统层面提供了三种内存屏障,即读屏障 写屏障 和全屏障,JVM基于操作系统层面的内存屏障实现了4种屏障类型,分别是读读屏障,读写屏障、写写屏障和写读屏障。volitile正是在代码执行之后加了一个storeLoad屏障,保证了此写入对后续读是可见的。
为什么存在指令重排序?举例说明
2. 线程池的使用,各参数的作用,拒绝策略的执行
- corePoolSize 核心线程数
- maximumPoolSize 最大线程数
- keepAliveTime 最大线程数持续时间
- unit 持续单位
- workQueue 线程队列
- threadFacory 线程工厂
- refectedHandler 拒绝策略(默认有几种拒绝策略?)
有时候会从源码级别考察,一个线程执行的过程
3. ThreadLocal原理,会出现什么问题?
主要说明实现原理,可以顺带说他的哈希碰撞解决方案用了线性寻址法,以及内存泄露的原因和应该怎么去处理
4. 锁升级的过程
对象在内存中包括 对象头 实例数据 填充数据
对象头包括mark word 对象指针 数组长度
markword 32位或者64位 分别包括线程Id hashcode值 分代年龄 是否偏向锁标识 锁标识等epoch
偏向锁 cas 把当前线程的ThreadId存储在对象头中
轻量级锁 自旋 把锁对象的指针指向当前栈帧中的lockRecord,
重量级锁 锁 monitor monitorenter monitorexit
5. 线程的一些方法wait,notify,condition await() signal()
wait, notify 是属于Object类的方法 基于monitor 监视器锁实现等待和唤醒,后台维护了一个等待队列和一个阻塞队列
await signal是condition接口的方法,是基于ReentrantLock锁实现的 基于AQS等待和唤醒
6.讲讲为什么ConcurrentHashMap是并发安全的吧,既然有锁怎么去统计size呢
7. ArrayList和LinkedList的区别
- arrayList是数组
- LinkedList是链表
8. HashMap的底层数据结构
数组加链表+红黑树
9. hashmap容量为什么是2的幂次?
因为计算数组下标的时候是hashcode & (n-1) 如果n是2的幂次方 转换成二进制后 后面的全是1,做&运算的时候能保证散落的更加均匀
10. 你重写过hashcode和equals么,要注意什么?
11. ConcurrentHashMap怎么解决HashMap的并发问题(源码)
主要是通过unsafe类的cas操作
12. CAS缺点和解决方案
cas 第一个缺点是大多数使用在自选中,但最后只有一个线程可以运行成功,效率较低
第二个是ABA问题,即第一个线程要修改的值是A,然后第二个线程先把值修改成B 然后在修改成A, 这时候cas依然可以成功。
13. Synchronize锁和ReetranLock锁的区别?
把你所知道的可以有逻辑的讲出来,mic的课程很清晰
14. CountDownLatch和CycleBarrier使用场景?
15. JDK动态代理和CGLIB动态代理
jdk动态代理基于接口,因为代理类本身已经继承了Proxy类, 实现Invocationhandler
Proxy.newInstance(ClassLoader, Class<?>[], Invocationhandler)
CGLIB动态代理是基于可继承的父类,通过Enhancer类加强器创建子类实现动态代理 实现MethodIntecetpor
16. 哈希冲突的四种解决办法
- 开放寻址法 如果可以预知哈希的大小,可以完美散列 ThreadLocalMap
- 线性探测
- 二次探测
- 随机数探测
- 拉链法
- 再哈希法
- 建立公共溢出区
17. 一致性Hash算法
- 常规哈希取模
- 不带虚拟节点的哈希 通过服务器的信息(比如 host、port、name等)通过hash算法形成一个圈,每个服务器负责一段范围的请求,如果超过了这个返回就重新回到第一个服务器。这中算法的缺点是其中一个服务挂了之后,所有的请求会转发到下一个服务,容易导致雪崩
- 带虚拟节点的哈希 跟上一个不同点是,把每一个服务器分布在环的不同位置,从而避免雪崩。
以上是关于Java基础和JUC常见问题的主要内容,如果未能解决你的问题,请参考以下文章