MENU

HashMap用可变对象作为key踩坑

前言

在Java道路上越踩越多坑,最近被问到一个知识点,当对象作为HashMap一个key时,再未重写equalshashcode方法时候,get方法返回的值为null

分析

在下面一段代码中,未重写equals以及hashCode方法情况下,输出结果为null

阅读全文

Java线程调度

线程调度是指系统为线程分配处理器使用权的过程,方式主要有:协同式线程调度抢占式线程调度

协同式线程调度

线程的执行时间由线程本身来控制,线程把自己的工作执行完成之后,要主动通知系统切换到另外一个线程上。

  • 好处:实现简单。且由于线程要把自己的事情干完后才会进行线程切换,切换操作对线程自己是可知。不存在线程同步问题。
  • 缺点:线程执行时间不可控制,甚至如果一个线程编写有问题,一直不告知系统进行线程切换,则程序就会一直阻塞在那里。

抢占式线程调度

每个线程将由系统来分配执行时间,线程的切换不由线程本身来决定(Java中,Thread.yield()可以让出执行时间,但是要获取执行时间的话,线程本身是没有办法的)。

  • 好处:线程的执行时间是系统可控的,也不会有一个线程导致整个进程阻塞的问题,Java使用的线程调度方式就是抢占式调度。

阅读全文

Java线程池

Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。
201926

阅读全文

Java内存模型

Java虚拟机规范中试图定义一种Java内存模型(JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。

阅读全文