美文网首页
java基础面试题

java基础面试题

作者: Aleryuen | 来源:发表于2020-04-08 19:22 被阅读0次

    HashMap和ConcurrentHashMap区别

    • HashMap是线程不安全的,ConcurrentHashMap是线程安全的,而且使用了分段锁的机制加速了多线程环境下的访问速度,性能比同样线程安全的Hashtable更好。
    • HashMap访问更快,使用的数据结构是数组链表和红黑树,允许null作为键和值

    ConcurrentHashMap的数据结构

    • Segment extend RetreenLock,分段锁,减少对同一个锁的访问时间
    • 16块链表数组,相当于每个是一个Hashtable

    高并发HashMap的环是如何产生的?

    比如两个线程同时插入一个key的值,一个key check完毕发现不存在准备插入的时候,另一个线程获取了cpu时间,去check也没有,然后插入了数据,第一个线程再次写入的时候就会覆盖第二个线程的数据,导致结果不符合预期。产生并发问题。

    volatile作用

    保证数据及时的从高速缓存刷新到主存中去,确保多线程环境下的可见性

    Atomic类如何保证原子性(CAS操作)

    ………………

    synchronized和Lock的区别

    简单点说,一个是关键字,一个是类,Lock更加精细化,可以查询锁的状态,但是是悲观锁,锁住了之后任何人都不能进来,而synchronized更加佛系一点。所以考虑到情况,能用关键字的尽量用效率会高。

    为什么要使用线程池?

    因为线程的创建和销毁会大量消耗cpu资源和时间,所以使用线程池解决这个问题,需要的时候直接拿来用,不需要的时候等到。线程池提前创建好,是程序效率更高。

    核心线程池ThreadPoolExecutor的参数

    核心线程数目;最大线程数目;闲置时间长度;闲置时间单位;一个同步的任务队列;线程工厂类(用来创建消费线程)

    ThreadPoolExecutor的工作流程

    创建核心线程池,各自从队列中获取任务执行,执行完毕后继续去获取任务,没有任务,非核心线程再超时的情况下可以销毁。如果队列太忙,执行程序设定的策略来丢弃新任务或者抛出错误等等策略来处理。

    如何控制线程池线程的优先级

    使用优先级队列来实现,具体不知道

    线程之间如何通信

    通过线程安全的全局变量;通过锁对象;
    lock,notify和wait方法;通过同步队列,LinkedBlockingQueue等

    Boolean占几个字节

    一个?no,编译的时候使用的是int类型,所以占用32个字节

    相关文章

      网友评论

          本文标题:java基础面试题

          本文链接:https://www.haomeiwen.com/subject/vjcxmhtx.html