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算法

  1. 常规哈希取模
  2. 不带虚拟节点的哈希 通过服务器的信息(比如 host、port、name等)通过hash算法形成一个圈,每个服务器负责一段范围的请求,如果超过了这个返回就重新回到第一个服务器。这中算法的缺点是其中一个服务挂了之后,所有的请求会转发到下一个服务,容易导致雪崩
  3. 带虚拟节点的哈希 跟上一个不同点是,把每一个服务器分布在环的不同位置,从而避免雪崩。

以上是关于Java基础和JUC常见问题的主要内容,如果未能解决你的问题,请参考以下文章

JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段

Java基础学习总结(193)—— JUC 常用并发工具类总结

Java---JUC并发篇(多线程详细版)

Java---JUC并发篇(多线程详细版)

java基础---多线程---JUC原子类

java基础(反射,注解,多线程,juc)