MENU

分类 Java 下的文章

HashMap用可变对象作为key踩坑

前言

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

分析

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

阅读全文

Java线程调度

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

协同式线程调度

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

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

抢占式线程调度

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

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

阅读全文

Java线程池

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

阅读全文

JVM内存分配与回收策略

  • 新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。
  • 老年代(Major GC/Full GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程)。Major GC的速度一般会比Minior GC慢10倍以上。

阅读全文