线程的状态有哪些?它是如何工作的?
介绍线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在。一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源、更加轻量化,也因此被称为轻量级的进程。
线程的状态在 JDK 1.5 之后以枚举的方式被定义在 Thread 的源码中,它总共包含以下 6 个状态:
NEW,新建状态,线程被创建出来,但尚未启动时的线程状态;
RUNNABLE,就绪状态,表示可以运行的线程状态,它可能正在运行,或者是在排队等待操作系统给它分配 CPU 资源;
BLOCKED,阻塞等待锁的线程状态,表示处于阻塞状态的线程正在等待监视器锁,比如等待执行 synchronized 代码块或者使用 synchronized 标记的方法;
WAITING,等待状态,一个处于等待状态的线程正在等待另一个线程执行某个特定的动作,比如,一个线程调用了 Object.wait() 方法,那它就在等待另一个线程调用 Object.notify() 或 Object.notifyAll() 方法;
TIMED_WAITING,计时等待状态,和等待状态(WA ...
02-HashMap底层是如何实现的
介绍在 JDK 1.7 中 HashMap 是以数组加链表的形式组成的,JDK 1.8 之后新增了红黑树的组成结构,当链表大于 8 并且容量大于 64 时,链表结构会转换成红黑树结构,它的组成结构如下图所示:
数组中的元素我们称之为哈希桶,它的定义如下:
12345678910111213141516171819202122232425262728293031323334353637383940static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next; Node(int hash, K key, V value, Node<K,V> next) { this.hash = hash; this.key = key; this.value = value; ...
01-String的特点是和它的那些重要的方法
介绍以主流的 JDK 版本 1.8 来说,String 内部实际存储结构为 char 数组,源码如下:
1234567891011public final class String implements java.io.Serializable, Comparable<String>, CharSequence { // 用于存储字符串的值 private final char value[]; // 缓存字符串的 hash code private int hash; // Default to 0 // ......其他内容}
String 源码中包含下面几个重要的方法。
1. 多构造方法String 字符串有以下 4 个重要的构造方法:
123456789101112131415161718192021// String 为参数的构造方法public String(String original) { this.value = original.value; this.hash = ori ...
Elasticsearch入门
基本概念Node 与 ClusterElastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。
单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
IndexElastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。
下面的命令可以查看当前节点的所有 Index。
1$ curl -X GET 'http://localhost:9200/_cat/indices?v'
DocumentIndex 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。
Document 使用 JSON 格式表示,下面是一个例子。
12345{ "user": "张三 ...
RabbitMq基于SpringBoot的项目最基础搭建流程
项目描述
项目基于maven
RabbitMq 搭建过程网上有很多 再次我就不复述了 直接使用现成搭建好的docker
ide是 idea (这句话就像是废话一样,没错我就是来凑字数的)
这里是docker 使用 RabbitMq的教程地址 基于 Docker 安装 RabbitMQ
项目结构图
项目文件pom.xml1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org ...
List如何一边遍历-一边删除
1. 新手常犯的错误可能很多新手(包括当年的我,哈哈)第一时间想到的写法是下面这样的:
1234567891011121314public static void main(String[] args) { List<String> platformList = new ArrayList<>(); platformList.add("博客园"); platformList.add("CSDN"); platformList.add("掘金"); for (String platform : platformList) { if (platform.equals("博客园")) { platformList.remove(platform); } } System.out.println(platformList);}
然 ...
什么是JVM中所谓的指针逃逸或引用逃逸
解释这个东西 首先需要介绍一下 jvm中的堆
堆(Java Heap) 也叫 Java 堆或者是 GC 堆,它是一个线程共享的内存区域,也是 JVM 中占用内存最大的一块区域,Java 中所有的对象都存储在这里。
然而 《Java虚拟机规范》对 Java 堆的描述是:“所有的对象实例以及数组都应当在堆上分配”。但这在技术日益发展的今天已经有点不那么“准确”了,比如 JIT(Just In Time Compilation,即时编译 )优化中的逃逸分析,使得变量可以直接在栈上被分配。
当对象或者是变量在方法中被创建之后,其指针可能被线程所引用,而这个对象就被称作指针逃逸或者是引用逃逸。
下面用一份代码来更形象化的解释一下 :
123456public static StringBuffer createString() { StringBuffer sb = new StringBuffer(); sb.append("Java"); return sb;}
其中 sb 虽然是一个局部变量,但上述代码可以看出,它被 ...
Lombok实现原理分析
在开始说 Lombok 的原理之前,我们先来简单地介绍一下 Lombok,它属于 Java 的一个热门工具类,使用它可以有效的解决代码工程中那些繁琐又重复的代码,如 Setter、Getter、toString、equals 和 hashCode 等等,向这种方法都可以使用 Lombok 注解来完成。
例如,我们使用比较多的 Setter 和 Getter 方法,在没有使用 Lombok 之前,代码是这样的:
1234567891011121314151617public class Person { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; ...
与-非-或-异或
1.位异或运算(^)两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。
2.位与运算符(&)两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否则为0。
3.位或运算符(|)两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0。
4.位非运算符(~)如果位为0,结果是1,如果位为1,结果是0.
在Java中,所有数据的表示方法都是以补码的形式表示,如果没有特殊说明,Java中的数据类型默认是int,int数据类型的长度是8位,一位是四个字节,就是32字节,32bit.
十进制的8转为二进制是100101.
如果位为0,结果是1,如果位为1,结果是0.
比如:~37
在Java中,所有数据的表示方法都是以补码的形式表示,如果没有特殊说明,Java中的数据类型默认是int,int数据类型的长度是8位,一位是四个字节,就是32字节,32bit.
8转为二进制是100101.
补码后为: 00000000 00000000 00000000 00100101
取反为: 11111111 11111111 11111111 ...
springBootFastJsonWebMvcConfigurer配置无效的解决方案,绝对不是扫包目录或没移除Jackson2HMConverter导致的
今天被坑惨了 为了这个沙雕问题 浪费了我2个小时
别问我 为什么不谷歌, 我这种情况谷歌能搜到解决方案的话,估计就只能搜到我这个帖子了
首先情况是这样的 :
写了2个配置类配置类A 继承了 WebMvcConfigurationSupport
配置类B 实现了 WebMvcConfigurer 用来做 fastjson在springboot的声明
最后导致 弄死 项目就是 用的 jackjson
原因就在于
WebMvcConfigurationSupport 和 WebMvcConfigurer 都可以去 重写 configureMessageConverters
也就是你配置 fastjson的 哪个方法 最终 导致 你WebMvcConfigurer里面写的代码完全无效
总结一下 情况就是 如下:
springboot 中 当你的一个配置类A 继承了 WebMvcConfigurationSupport以后另外一个配置类B再去 实现 WebMvcConfigurer会导致 你配置类B中写的任何代码 都不会 再生效
解决方案 , 把 配置类B 中的 所有方法的代码 复 ...