JDK

java 双亲委派机制

青春壹個敷衍的年華 提交于 2021-02-13 15:27:13
JDK默认ClassLoader JDK 默认提供了如下几种ClassLoader 1. Bootstrp loader(启动类加载器) Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib,-Xbootclasspath参数指定的路径以及%JAVA_HOME%/jre/classes中的类。 1. ExtClassLoader (标准扩展类加载器) Bootstrp loader加载ExtClassLoader,并且将ExtClassLoader的父加载器设置为Bootstrploader.ExtClassLoader是用Java写的,具体来说就是 sun.misc.Launcher$ExtClassLoader,ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext,此路径下的所有classes目录以及java.ext.dirs系统变量指定的路径中类库。 2. AppClassLoader(应用程序类加载器) Bootstrp loader加载完ExtClassLoader后,就会加载AppClassLoader,并且将AppClassLoader的父加载器指定为 ExtClassLoader。AppClassLoader也是用Java写成的,它的实现类是sun.misc

netty : NioEventLoopGroup 源码分析

前提是你 提交于 2021-02-13 14:00:25
1. 基本思路    这里首先讲一下结论,也就是先说我看这个类的源码整理出来的思路,主要就是因为这些类太杂,一个功能在好几个类中才完全实现。    我们在 new 一个 worker/boss 线程的时候一般是采用的直接使用的无参的构造方法,但是无参的构造方法他创建的线程池的大小是我们 CPU 核心的 2 倍。紧接着就需要 new 这么多个线程放到线程池里面,这里的线程池采用的数据结构是一个数组存放的,每一个线程需要设置一个任务队列,显然任务队列使用的是一个阻塞队列,这里实际采用的是 LinkedBlockQueue ,然后回想一下在 jdk 中的线程池是不是还有一个比较重要的参数就是线程工厂,对的!这里也有这个东西,他是需要我们手动传入的,但是如果不传则会使用一个默认的线程工厂,里面有一个 newThread 方法,这个方法实现基本和 jdk 中的实现一模一样,就是创建一个级别为 5 的非 Daemon 线程。对这就是我们在创建一个线程池时候完成的全部工作!    好现在来具体说一下,我们每次创建的是 NioEventLoopGroup 但是他又继承了 n 个类才实现了线程池,也就是线程池的祖先是 ScheduledExecutorService 是 jdk 中的线程池的一个接口,其中里面最重要的数据结构就是一个 children 数组,用来装线程的。   

netty : NioEventLoopGroup 源码分析

穿精又带淫゛_ 提交于 2021-02-13 14:00:12
NioEventLoopGroup 源码分析 1. 在阅读源码时做了一定的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限。为了方便 IDE 查看、跟踪、调试 代码,所以在 github 上提供 netty 的源码、详细的注释及测试用例。欢迎大家 star、fork ! 2. 由于个人水平有限,对源码的分析理解可能存在偏差或不透彻的地方还请大家在评论区指出,谢谢!    从今天开始,就准备进军 ne tty 了,主要的想法是看看 netty4 中一些比较重要的实现,也就是能经常出现在我们面前的东西。主要是: 线程池、通道、管道、编解码器、以及常用的工具类。    然后现在看源码应该不会像之前的 jdk 那么细致了,主要是看了一个类以后就发现 netty 对代码封装太强了,基本一个功能可能封装了七八个类去实现,很多的抽象类但是这些抽象类中的功能还非常的多。所以说主要看这个流程,以及里面写的比较好的代码或者比较新的思想会仔细的去看看。具体的子字段,每个方法不可能做到那么细致。 <!-- more -->    好,正式开始 netty 源码征战 ! 1. 基本思路    这里首先讲一下结论,也就是先说我看这个类的源码整理出来的思路,主要就是因为这些类太杂,一个功能在好几个类中才完全实现。    我们在 new 一个 worker/boss

Netty中NioEventLoopGroup的创建源码分析

怎甘沉沦 提交于 2021-02-13 13:54:40
NioEventLoopGroup的无参构造: 1 public NioEventLoopGroup() { 2 this (0 ); 3 } 调用了单参的构造: 1 public NioEventLoopGroup( int nThreads) { 2 this (nThreads, (Executor) null ); 3 } 继续看到双参构造: 1 public NioEventLoopGroup( int nThreads, Executor executor) { 2 this (nThreads, executor, SelectorProvider.provider()); 3 } 在这里是使用JDK中NIO的原生API:SelectorProvider的provider,产生了一个SelectorProvider对象调用,继续调用三参构造。 关于SelectorProvider在我前面的博客中有介绍过: 【Java】NIO中Selector的创建源码分析 ,在Windows下默认创建了WindowsSelectorProvider对象。 继续看三参构造: 1 public NioEventLoopGroup( int nThreads, ThreadFactory threadFactory, SelectorProvider selectorProvider) {

Netty源码阅读系列之源码导入eclipse

∥☆過路亽.° 提交于 2021-02-13 11:09:23
下载 github地址: 点击下载netty 目前github中netty的版本为4.1 编译 打开下载的源码所在目录,执行命令: mvn clean compile 出现checkstyle问题。CheckStyle是maven的一个模块用以检测代码风格的,比如缩进是使用空格还是Tab,netty使用它来规范代码格式,避免低级语法错误。如果要为netty贡献代码,这个很重要,但是自己导入eclipse自己用,这个东西还是敬谢不敏了。更改命令为: mvn clean compile -Dcheckstyle.skip = true 出现问题: Unknown lifecycle phase ".skip=true". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources,

Java | 深入理解String、StringBuilder 和 StringBuffer

放肆的年华 提交于 2021-02-13 08:52:14
1 碎碎念 这是一道老生常谈的问题了,字符串是不仅是 Java 中非常重要的一个对象,它在其他语言中也存在。比如 C++、Visual Basic、C# 等 。字符串使用 String 来表示,字符串一旦被创建出来就不会被修改,当你想修改 StringBuffer 或者是 StringBuilder,出于效率的考量,虽然 String 可以通过 + 来创建多个对象达到字符串拼接的效果,但是这种拼接的效率相比 StringBuffer 和 StringBuilder,那就是心有余而力不足了。本篇文章我们一起来深入了解一下这三个对象。 2 简单认识这三个对象 String String 表示的就是 Java 中的字符串,我们日常开发用到的使用 "" 双引号包围的数都是字符串的实例。String 类其实是通过 char 数组来保存字符串的。下面是一个典型的字符串的声明 String s = "abc" ; 上面你创建了一个名为 abc 的字符串。 字符串是恒定的,一旦创建出来就不会被修改,怎么理解这句话?我们可以看下 String 源码的声明 告诉我你看到了什么?String 对象是由 final 修饰的,一旦使用 final 修饰的类不能被继承、方法不能被重写、属性不能被修改。而且 String 不只只有类是 final 的,它其中的方法也是由 final 修饰的,换句话说,Sring

解决spring-boot-maven-plugin插件打包,springboot启动时报找不到主main问题

半腔热情 提交于 2021-02-13 08:39:35
一:遇到的问题及解决方法 最近在搭建一个新项目时,使用spring-boot-maven-plugin插件打包,springboot项目在发布后启动时遇到找不到主main问题。 遇到这个问题当时感觉本地直接idea里启动springboot好好的,为什么用自动化发布工具发布后怎么就出现这个问题了呢? 就到线上打好的包解压看MANIFEST.MF文件里的内容如下: Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Built-By: spy Created-By: Apache Maven 3.3.9 Build-Jdk: 1.8.0_74 只有一些简单的内容并没有启动类,主类什么的?所以报那个找不到主main就非常明确了。所以就怀疑是不是spring-boot-maven-plugin打包插件里些配置没有指定导致的? 后来通过网上查询与看官网的文档还真是这个原因: 我们这个的原因的是由于在spring-boot-maven-plugin插件里没有指定goal导致的: 出现在问题时的配置是这个样的: <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId>

java 线程的几种状态

拈花ヽ惹草 提交于 2021-02-12 19:40:31
java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常运行中, 当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等, 这个状态下发生的等待一般是其他系统资源, 而不是锁, Sleep等 BLOCKED 这个状态下, 是在多个线程有同步操作的场景, 比如正在等待另一个线程的synchronized 块的执行释放, 或者可重入的 synchronized块里别人调用wait() 方法, 也就是这里是线程在等待进入临界区 WAITING 这个状态下是指线程拥有了某个锁之后, 调用了他的wait方法, 等待其他线程/锁拥有者调用 notify / notifyAll 一遍该线程可以继续下一步操作, 这里要区分 BLOCKED 和 WATING 的区别, 一个是在临界点外面等待进入, 一个是在理解点里面wait等待别人notify, 线程调用了join方法 join了另外的线程的时候, 也会进入WAITING状态, 等待被他join的线程执行结束 TIMED_WAITING 这个状态就是有限的(时间限制)的WAITING, 一般出现在调用wait(long), join(long)等情况下, 另外一个线程sleep后, 也会进入TIMED

java核心基础 --- String.intern

青春壹個敷衍的年華 提交于 2021-02-12 19:30:24
本篇博文转载自: https://tech.meituan.com/2014/03/06/in-depth-understanding-string-intern.html 相信很多 JAVA 程序员都做过类似 String s = new String("abc") 这语句创建了几个对象的题目。这种题目主要就是为了考察程序员对字符串对象的常量池掌握与否。上述的语句中是创建了 2 个对象,第一个对象是 "abc" 字符串存储在常量池中,第二个对象在 JAVA Heap 中的 String 对象。 除此之外,我们还应该掌握 String 常量池的相关知识。它的主要使用方法有两种: 直接使用双引号声明出来的 String 对象会直接存储在常量池中 如果不是使用双引号声明的 String 对象,可以使用 String 提供的 intern 方法。intern 方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中。不过这个方法在 JDK6 和 JDK7 中却会表现出不一样的行为,接下来我们来看看他们的区别。 先来看一段代码: public static void main(String[] args){ String s = new String("1"); s.intern(); String s2 = "1"; System.out.println(s =

从零开始搭建后台管理系统(一)--创建SpringBoot项目

不打扰是莪最后的温柔 提交于 2021-02-12 18:58:42
最近我在搭建一个SpringBoot的后台管理系统,写到一半想起来博客好像很久很久没更新了,所以准备把这个项目的开发过程记录到博客系统里,这个系统现在已经集成了Mysql、Mybatis-Plus、Redis、Shiro、Druid、lombok。这个系统我开发了两个星期了,主要时间花在Shiro上了,现在Shrio使用Redis作为Catch和Session存储器,未来准备集成Kafka作为日志记录系统,把日志数据写到数据库里。 第一步我们要创建一个SpringBoot项目,我个人习惯使用IDEA,所以使用IDEA创建SpringBoot项目。 打开IDEA,点击File->New->Project。然后选择SpringInitializr,点next,配置项目信息。我自己本地装的还是JDK8,所以JavaVersion就选8。配置信息配置好之后,就要选择引用的包,我们到时候自己在pom文件里添加就行,继续next,配置项目名称。最后配置一下项目名称和创建地址,我们就搭建成了。 这个是项目的地址 https://github.com/Raindtop/Spring-Backstage,这个后台搭建的所有代码都在这里面。 来源: oschina 链接: https://my.oschina.net/u/4109273/blog/4952473