java基础面试题

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基础面试题)