JDK

横空出世!复盘B站面试坑我最深的Java并发:JDK源码剖析

拈花ヽ惹草 提交于 2020-12-14 17:59:30
JDK源码 对于人脑的认知来说,“代码一行行串行”当然最容易理解。但在多线程下,多个线程的代码交叉并行,要访问互斥资源,要互相通信。作为开发者,需要仔细设计线程之间的互斥与同步,稍不留心,就会写出非线程安全的代码。正因此,多线程编程一直是一个被广泛而深入讨论的领域。 由于篇幅限制,为了不影响观看,就将主要内容截图下来了,需要完整版的小伙伴可以帮LZ转发+关注,文末扫码即可免费领取~ 开始正题 第1章多线程基础 线程的状态迁移过程 第2章Atomic类 Striped64与LongAdder 第3章Lock与Condition 互斥锁 第4章同步工具类 多个线程访问 第5章并发容器 无锁链表+插入节点+ 删除节点 第6章线程池与Future 线程池的实现原理 第7章ForkJoinPool 核心数据结构 第8章CompletableFuture 任务的链式 最后 Java并发编程是每个程序员敲代码必不可少的,源码对于程序员来说也是很重要的,如果你不了解研究完这份文档,技能更上一层。 需要这份完整版《Java并发实现原理:JDK源码分析》的小伙伴可以帮LZ转发+关注,扫码即可! 来源: oschina 链接: https://my.oschina.net/u/4715492/blog/4795679

为了忽悠大厂面试官,熬夜总结了这些Spring面试题!

这一生的挚爱 提交于 2020-12-14 13:04:22
1.说说Spring 里用到了哪些设计模式? 单例模式 :Spring 中的 Bean 默认情况下都是单例的。无需多说。 工厂模式 :工厂模式主要是通过 BeanFactory 和 ApplicationContext 来生产 Bean 对象。 代理模式 :最常见的 AOP 的实现方式就是通过代理来实现,Spring主要是使用 JDK 动态代理和 CGLIB 代理。 模板方法模式 :主要是一些对数据库操作的类用到,比如 JdbcTemplate、JpaTemplate,因为查询数据库的建立连接、执行查询、关闭连接几个过程,非常适用于模板方法。 2.谈谈你对IOC 和 AOP 的理解?他们的实现原理是什么? IOC 叫做控制反转,指的是通过Spring来管理对象的创建、配置和生命周期,这样相当于把控制权交给了Spring,不需要人工来管理对象之间复杂的依赖关系,这样做的好处就是解耦。在Spring里面,主要提供了 BeanFactory 和 ApplicationContext 两种 IOC 容器,通过他们来实现对 Bean 的管理。 AOP 叫做面向切面编程,他是一个编程范式,目的就是提高代码的模块性。Srping AOP 基于动态代理的方式实现,如果是实现了接口的话就会使用 JDK 动态代理,反之则使用 CGLIB 代理,Spring中 AOP 的应用主要体现在 事务、日志

Hadoop3.x中一把锁毁灭的大数据集群

本小妞迷上赌 提交于 2020-12-14 10:33:05
集群版本:HDP3.1.5 Hadoop版本:Hadoop3.1.1 源码地址: https://github.com/hortonworks/hadoop-release/tree/HDP-3.1.5.152-1-tag 一、前置知识 ​ 大家都知道hadoop的核心组件是HDFS和YARN,HDFS负责存储,YARN负责计算资源管理,今天要重点扯一扯YARN。YARN的架构跟众多分布式架构一样是主从式,为了维护可靠性,ResourceManager(RM)支持High Available(HA)功能。在所有人的认知中,只要是主从架构,挂了一个slave节点或master节点,框架内部的容错机制都会保证整个系统的正常运行,加上下游的计算应用的重试机制,甚至对用户无感知。貌似所有人都关心一种情况,就是某个或者某种类型的节点挂掉,但是,还有没有其它情况呢?非死即生?不,还有一种叫stop the world生不如死,类似jvm的gc,这也是java生态框架最头疼问题之一。当然,今天要讲的不是gc,而是另一种情况下的java进程stop the world导致的严重问题——锁。 为什么需要锁 RM作为资源管理服务,必然要维护存储资源的信息,最简单的,比如Container被客户端申请分配,多线程的情况下,要保证Container数值的准备性,多线程下客户端要申请资源,会对数值进行更改

Java(JNA)调用C++动态库(dll)

北城余情 提交于 2020-12-14 07:03:31
JNA(Java Native Access):是建立在JNI之上的Java开源框架,SUN主导开发,用来调用C、C++代码,尤其是底层的库文件(windows中叫dll文件,linux下是.so文件)。 先注意几个问题: 1.下载jna.jar包,jna-platform.jar 可以不要,但是有的话对代码的调试是有帮助的;platform.jar对于jna.jar是一种补充和扩展,jna.jar相当于核,platfrorm.jar相当于增量插件。 2.动态链接库编译时的平台。如果是通过x86平台编译,那么就只能使用32位的jdk环境加载,如果是64位jdk就必须使用x64平台编译动态库;不然,即使后面编码,动态链接库的路径都没有问题,调用还是会报错。 3.调用时多注意dll的位置。 代码开始: 对于Java来说,一般都是调用已经生成好的dll动态库。所以LZ并没有贴动态库的生成。若需要,百度一下即可。 public class JNATestDll { public interface Dll extends Library{ Dll instance = (Dll) Native.loadLibrary("HidComm", Dll. class ); public boolean LoadHidComm(); public boolean HidWriteData

Java的枚举与注解

☆樱花仙子☆ 提交于 2020-12-14 01:13:43
一、枚举类 JDK1.5之前需要自定义枚举类;JDK 1.5 新增的 enum 关键字用于定义枚举类。若枚举只有一个成员, 则可以作为一种单例模式的实现方式 1.1 枚举类的属性 枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰。 枚举类的使用 private final 修饰的属性应该在构造器中为其赋值。 若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数。 1.2 Enum枚举类 必须在枚举类的第一行声明枚举类对象。 JDK 1.5 中可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字, 无需添加枚举类作为限定。 枚举类和普通类的区别: 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类 枚举类的构造器只能使用 private 访问控制符 枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾). 列出的实例系统会自动添加 public static final 修饰 1.3 使用 Enum 定义的示例 package org.springframework.http; import org.springframework.lang.Nullable; /** * Enumeration of HTTP status codes. *

大咖云集,一场技术盛宴等你来约!| 免费报名、周边豪礼

主宰稳场 提交于 2020-12-13 21:54:08
导语: 腾讯年度技术盛会 Techo Park 开发者大会将于12月19日在北京798艺术中心举行,本次大会旨在汇聚全球顶尖行业专家和技术爱好者,搭建一个开放、中立、活跃的技术交流平台。微服务作为云原生重要的技术领域,组委会专门设立了微服务分论坛,与大家分享微服务转型的全生命周期的技术解决方案和实践经验。 大会现场 除了技术大咖面对面交流外,还设立了有趣的游戏玩法和周边豪礼!下面由小Q妹为大家解锁下微服务分论坛的精彩内容和游戏玩法吧! 今年 Techo Park 开发者大会将设置1场主论坛,29场垂直技术分论坛以及多场独具特色的创新互动活动,来自国内外200多位技术大咖将现场为大家带来一场年度的技术嘉年华。 主论坛 在大咖云集的主论坛,腾讯高级执行副总裁、腾讯云与智慧产业事业群总裁汤道生、腾讯云副总裁王慧星、Linux基金会执行董事Jim Zemlin 、AWS Lambda 创始人&前总经理Tim Wagner,厦门大学博士生导师、国家“万人计划”青年拔尖人才纪荣嵘,腾讯杰出科学家、多媒体实验室总经理刘杉,腾讯云副总裁、腾讯会议负责人&多媒体实验室联合负责人吴祖榕,腾讯云安全总经理、腾讯安全云鼎实验室负责人董志强,腾讯云容器产品总经理邹辉、腾讯云数据库负责人林晓斌,以及微信小程序及云开发创始团队核心负责人、微信专家工程师林超,腾讯开源联盟主席单致豪等众多专家

[多线程] Java线程池应用及原理分析(JDK1.8)

生来就可爱ヽ(ⅴ<●) 提交于 2020-12-13 20:03:00
一 线程池优点   1、线程在创建和销毁时是非常耗费资源的,使用 线程池可以减少创建和销毁线程的次数 ,每个工作线程都可以重复使用。   2、可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。   对操作系统来说,创建一个线程的代价是十分昂贵的, 需要给它分配内存、列入调度,同时在线程切换的时候还要执行内存换页,CPU 的缓存被清空。切换回来的时候还要重新从内存中读取信息,破坏了数据的局部性。   关于时间,创建线程使用是直接向系统申请资源的,这里调用系统函数进行分配资源的耗时不好说。   关于资源,Java线程的线程栈所占用的内存是在Java堆外的,所以是不受java程序控制的,只受系统资源限制,默认一个线程的线程栈大小是1M(当让这个可以通过设置 -Xss 属性设置,但是要注意栈溢出问题),但是,如果每个用户请求都新建线程的话,1024个用户光线程就占用了1个G的内存,如果系统比较大的话,一下子系统资源就不够用了,最后程序就崩溃了。   PS:同样的道理在java程序中也不要随意开启新的线程,特别是高频业务尽量使用线程池,不然很容易导致内存不足,程序崩溃的问题。 二 线程池创建    java.uitl.concurrent.ThreadPoolExecutor 类是线程池中最核心的一个类,因此如果要透彻地了解Java中的线程池

多态:JVM是如何进行方法调用的

ε祈祈猫儿з 提交于 2020-12-13 19:56:32
  在我们平时的工作学习中写java代码时,如果我们在同一个类中定义了两个方法名和参数类型都相同的方法时,编译器会直接报错给我们。还有在代码运行的时候,如果子类定义了一个与父类完全相同的方法的时候,父类的方法就会被覆盖,(也就是我们平时说的重写)。 那么,jvm虚拟机是如何精确识别目标方法的。 重载、重写与多态 重载:方法名相同而参数类型不相同的方法之间的关系。 重写:方法名相同并且参数类型也相同的方法之间的关系。 这两个概念我们耳熟能详,那么重载和重写是如何判断的呢? 重载: 重载的方法在编译期间就可以完成识别 。java编译器会根据所传入参数的声明类型对方法名相同的方法进行选取。 除了同一个类中,如果A继承了B,A中定义了与B中的非私有方法同名的方法,而且这两个方法的参数类型不同,那么A和B类同样构成了重载 重写: 重写方法的判断是在运行期间才可以完成识别的。 我们都知道多态是java面向对象语言的三大特性之一。而方法的重写,就是最能体现多态的一种方式:它允许子类在继承父类部分特性的同时,拥有自己独特的行为。 举个简单的例子帮大家理解一下多态: 比如我们按下b这个键,在dota中代表的是敌法师的blink技能,在lol中是回城,在网游里又成了背包。对于不同的对象拥有不同的行为,这就是多态。 静态绑定与动态绑定 接下来,我们来看一下jvm是如何识别目标方法的。 刚才我们说到

Java中SPI机制详解

谁说我不能喝 提交于 2020-12-13 14:03:27
本文转载于 高级开发必须理解的Java中SPI机制 本文通过探析JDK提供的,在开源项目中比较常用的Java SPI机制,希望给大家在实际开发实践、学习开源项目提供参考。 一、 SPI是什么 SPI全称 Service Provider Interface ,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。 整体机制图如下: Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。 系统设计的各个抽象,往往有很多不同的实现方案,在面向的对象的设计里,一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。 Java SPI就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。所以SPI的核心思想就是解耦。 二、使用场景 概括地说,适用于:调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略。 比较常见的例子: 数据库驱动加载接口实现类的加载 JDBC加载不同类型数据库的驱动 日志门面接口实现类加载 SLF4J加载不同提供商的日志实现类 Spring

JDK Base64编解码1.7和1.8的坑

▼魔方 西西 提交于 2020-12-13 10:49:46
场景 对接一个第三方api接口,其中签名部分用的是JDK8的编码。我们线上采用JDK7,导致项目无法编译 替换编解码部分为1.7的代码,然后签名又不对 所以坑就在这里,结论,1.7的编解码有换行符导致签名失败 贴代码 import sun.misc.BASE64Decoder; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.Signature; import java.security.spec.PKCS8EncodedKeySpec; import java.util.Base64; public class Base64EncodeDemo { public static final String CHARSET_UTF_8 = "UTF-8"; public static final String ALGORITHM_RSA = "RSA"; public static final String ALGORITHM_SHA1_WITH_RSA = "SHA1withRSA"; private static String sign WithRSAJdk7(String source, String privateKey, String