线程池解析
前言掌握线程池是后端程序员的基本要求,相信大家求职面试过程中,几乎都会被问到有关于线程池的问题。我在网上搜集了几道经典的线程池面试题,并以此为切入点,谈谈我对线程池的理解。如果有哪里理解不正确,非常希望大家指出,接下来大家一起分析学习吧。
经典面试题
面试问题1:Java的线程池说一下,各个参数的作用,如何进行的?
面试问题2:按线程池内部机制,当提交新任务时,有哪些异常要考虑。
面试问题3:线程池都有哪几种工作队列?
面试问题4:使用无界队列的线程池会导致内存飙升吗?
面试问题5:说说几种常见的线程池及使用场景?
线程池概念线程池: 简单理解,它就是一个管理线程的池子。
它帮我们管理线程,避免增加创建线程和销毁线程的资源损耗。因为线程其实也是一个对象,创建一个对象,需要经过类加载过程,销毁一个对象,需要走GC垃圾回收流程,都是需要资源开销的。
提高响应速度。 如果任务到达了,相对于从线程池拿线程,重新去创建一条线程执行,速度肯定慢很多。
重复利用。 线程用完,再放回池子,可以达到重复利用的效果,节省资源。
线程池的创建线程池可以通过ThreadPoolExecutor来创建 ...
无题
前言代码中如果if-else比较多,阅读起来比较困难,维护起来也比较困难,很容易出bug,接下来,本文将介绍优化if-else代码的八种方案。
优化方案一:提前return,去除不必要的else如果if-else代码块包含return语句,可以考虑通过提前return,把多余else干掉,使代码更加优雅。
优化前:
12345if(condition){ //doSomething}else{ return ;}
优化后:
1234if(!condition){ return ;}//doSomething
优化方案二:使用条件三目运算符使用条件三目运算符可以简化某些if-else,使代码更加简洁,更具有可读性。
优化前:
123456int price ;if(condition){ price = 80;}else{ price = 100;}
优化后:
1int price = condition?80:100;
优化方案三:使用枚举在某些时 ...
jstack命令学习
前言如果有一天,你的Java程序长时间停顿,也许是它病了,需要用jstack拍个片子分析分析,才能诊断具体什么病症,是死锁综合征,还是死循环等其他病症,本文我们一起来学习jstack命令~
jstack 的功能
jstack用法
线程状态等基础回顾
实战案例1:jstack 分析死锁
实战案例2:jstack 分析CPU 过高
jstack 的功能jstack是JVM自带的Java堆栈跟踪工具,它用于打印出给定的java进程ID、core file、远程调试服务的Java堆栈信息.
12jstack prints Java stack traces of Java threads for a given Java process orcore file or a remote debug server.
jstack命令用于生成虚拟机当前时刻的线程快照。
线程快照是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。
线程出现停顿的时候通过jstack来查看各个线程的 ...
Java map 应该掌握的8个问题
前言最近几天看了几篇有关于Java Map的外国博文,写得非常不错,所以整理了Java map 应该掌握的8个问题,都是日常开发司空见惯的问题,希望对大家有帮助;如果有不正确的地方,欢迎提出,万分感谢哈~
本章节所有代码demo已上传github
1、如何把一个Map转化为List日常开发中,我们经常遇到这种场景,把一个Map转化为List。map转List有以下三种转化方式:
把map的键key转化为list
把map的值value转化为list
把map的键值key-value转化为list
伪代码如下:
123456// key listList keyList = new ArrayList(map.keySet());// value listList valueList = new ArrayList(map.values());// key-value listList entryList = new ArrayList(map.entrySet());
示例代码:
123456789101112131415161718public class Test ...
Java对象序列化
前言相信大家日常开发中,经常看到Java对象“implements Serializable”。那么,它到底有什么用呢?本文从以下几个角度来解析序列这一块知识点~
什么是Java序列化?
为什么需要序列化?
序列化用途
Java序列化常用API
序列化的使用
序列化底层
日常开发序列化的注意点
序列化常见面试题
一、什么是Java序列化?
序列化:把Java对象转换为字节序列的过程
反序列:把字节序列恢复为Java对象的过程
二、为什么需要序列化?Java对象是运行在JVM的堆内存中的,如果JVM停止后,它的生命也就戛然而止。
如果想在JVM停止后,把这些对象保存到磁盘或者通过网络传输到另一远程机器,怎么办呢?磁盘这些硬件可不认识Java对象,它们只认识二进制这些机器语言,所以我们就要把这些对象转化为字节数组,这个过程就是序列化啦~
打个比喻,作为大城市漂泊的码农,搬家是常态。当我们搬书桌时,桌子太大了就通不过比较小的门,因此我们需要把它拆开再搬过去,这个拆桌子的过程就是序列化。 而我们把书桌复原回来(安装)的过程就是反序列化啦。
三、序列化用途序列化使得对象可以脱离程序运行 ...
无题
前言春节来临之际,祝大家新年快乐。整理了Java枚举的相关知识,算是比较基础的,希望大家一起学习进步。
本章节所有代码demo已上传github
一、枚举类型是什么?JDK5引入了一种新特性,关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这就是枚举类型。
一个枚举的简单例子
123enum SeasonEnum { SPRING,SUMMER,FALL,WINTER;}
二、 枚举类的常用方法Enum常用方法有以下几种:
name(); 返回enum实例声明时的名字。
ordinal(); 返回一个int值,表示enum实例在声明的次序。
equals(); 返回布尔值,enum实例判断相等
compareTo() 比较enum实例与指定对象的顺序
values(); 返回enum实例的数组
valueOf(String name) 由名称获取枚举类中定义的常量
直接看例子吧:
12345678910111213141516enum Shrubbery { GROUN ...
Java程序员必备的基础流程图
前言:整理了一些Java基础流程图/架构图,做一下笔记,大家一起学习。
1.spring的生命周期Spring作为当前Java最流行、最强大的轻量级容器框架,了解熟悉spring的生命周期非常有必要;
首先容器启动后,对bean进行初始化
按照bean的定义,注入属性
检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给bean,如BeanNameAware等
以上步骤,bean对象已正确构造,通过实现BeanPostProcessor接口,可以再进行一些自定义方法处理。如:postProcessBeforeInitialzation。
BeanPostProcessor的前置处理完成后,可以实现postConstruct,afterPropertiesSet,init-method等方法,增加我们自定义的逻辑,
通过实现BeanPostProcessor接口,进行postProcessAfterInitialzation后置处理
接着Bean准备好被使用啦。
容器关闭后,如果Bean实现了DisposableBean接口,则会回调该接口的dest ...
Java程序员必备:异常的十个关键知识点
前言总结了Java异常十个关键知识点,面试或者工作中都有用哦,加油。
一. 异常是什么异常是指阻止当前方法或作用域继续执行的问题。比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异常。
一个文件找不到的异常:
123456789public class TestException { public static void main(String[] args) throws IOException { InputStream is = new FileInputStream("jaywei.txt"); int b; while ((b = is.read()) != -1) { } }}
运行结果:
123456Exception in thread "main" java.io.FileNotFoundException: jaywei.txt (系统找不到指定的文件。) at java.io.Fil ...
volatile的学习
前言volatile是Java程序员必备的基础,也是面试官非常喜欢问的一个话题,本文跟大家一起开启volatile学习之旅,如果有不正确的地方,也麻烦大家指出哈,一起相互学习~
1.volatile的用法
2.volatile变量的作用
3.现代计算机的内存模型(计算机模型,总线,MESI协议,嗅探技术)
4.Java内存模型(JMM)
5.并发编程的3个特性(原子性、可见性、有序性、happen-before、as-if-serial、指令重排)
6.volatile的底层原理(如何保证可见性,如何保证指令重排,内存屏障)
7.volatile的典型场景(状态标志,DCL单例模式)
8.volatile常见面试题&&答案解析
公众号:捡田螺的小男孩
github 地址
https://github.com/whx123/JavaHome
1.volatile的用法volatile关键字是Java虚拟机提供的的最轻量级的同步机制,它作为一个修饰符出现,用来修饰变量,但是这里不包括局部变量哦。我们来看个demo吧,代码如下:
1234567891011121314 ...
JVM系列基础图
前言最近看了深入理解Java虚拟机第三版,整理了一些基础结构图,算是比较全的了,做一下笔记,大家一起学习。
1.Java虚拟机运行时数据区图JVM内存结构是Java程序员必须掌握的基础。
程序计数器
程序计数器,可以看作当前线程所执行的字节码的行号指示器
它是线程私有的。
Java虚拟机栈
线程私有的,生命周期与线程相同。
每个方法被执行的时候都会创建一个”栈帧”,用于存储局部变量表(包括参数)、操作数栈、动态链接、方法出口等信息。
局部变量表存放各种基本数据类型boolean、byte、char、short等
本地方法栈
与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为Native方法服务。
Java堆
Java堆是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,在JVM启动时创建。
其大小通过-Xms和-Xmx参数设置,-Xms为JVM启动时申请的最小内存,-Xmx为JVM可申请的最大内存。
方法区
它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。-可以通过-XX:Perm ...