java
文章平均质量分 84
不知为MUJI
站在树上的鸟从不害怕树枝断裂,因为它相信的不是树,而是翅膀。
展开
-
【Go】从Java到Go快速入门
目录1. 变量1.1 短变量声明1.2 零值2.函数2.1 返回值2.1.1 多个返回值2.1.2 命名返回值3.结构体3.1 类型判断3.2 方法3.2.1指针接收者4. 接口4.1 隐式实现接口4.2 空接口觉得与Go最像的是C,有结构体,没有类1. 变量1.1 短变量声明var i, j int = 1, 2 k...原创 2020-04-21 19:08:28 · 753 阅读 · 0 评论 -
【并发编程】一张图彻底理解了ReentrantLock和AQS
类比synchronized synchronized ReentrantLock 相同点 可重入 比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的 不同点 JVM实现 JDK API (java.util.concurrent) ...原创 2020-04-01 13:53:08 · 275 阅读 · 0 评论 -
【OSGI】用OSGI解决JAR包冲突
目录1.简介2.基本概念2.1 Bundle2.1.1 隔离2.1.2 交互2.2Service3.框架felix使用3.1加载并解析jar为Bundle3.2 Bundle的Classloader的隔离机制以及类共享机制3.2.1 maven bundle插件export3.3 使用方B获取1.简介OSGi(Open Service Gate...原创 2020-03-31 17:23:51 · 1787 阅读 · 0 评论 -
【JDK1.6】HashMap死循环形成原因
目录1.扩容形成环路2.get(key)操作死循环1.扩容形成环路在put元素超过负载阈值时会触发HashMap的扩容resize操作,一个桶的链表会重新散列到新表中, /** * put 插入元素之后,负载超过阈值,触发resize方法扩容 */ void addEntry(int hash, K key, V value, int bu...原创 2020-03-27 17:26:39 · 728 阅读 · 0 评论 -
【bugfix】记一次CPU飙高的排查经历
1.定位进程top拿到cpu占用最高进程的进程号pid=143982.定位线程top -H -p pid 特定进程中的线程top -H -p 14398找到最高的线程id:29230、29156、29151、29197、29240、29284、29291转换成hex十六进制:722e、71e4、71df、720d、7238、7264、726b3.线程虚拟机栈分析...原创 2020-03-27 11:47:51 · 485 阅读 · 0 评论 -
【JDK1.8源码】ConcurrentHashMap并发容器图解
1.类图对比HashMapConcurrentHashMap(CHM) HashMap(HM) 2.并发实现2.1 内部对象安全发布数据结构与HashMap对比可以发现table是大体相似的,而entrySet等返回的都是View的视图包装类。防止直接发布内部容器,被意外修改,导致Map的不变式约束被破坏,数据不一致不完整。读写操作都做了重写,当对ent...原创 2020-03-24 21:05:38 · 325 阅读 · 0 评论 -
【并发】为什么HashMap是线程不安全的?
0.背景经常会看到说HashMap是线程不安全的,ConcurrentHashMap是线程安全的等等说法,不禁有个疑问,什么是线程安全?什么样的类是线程安全的?1.什么是线程安全性(what)线程安全定义,最核心是正确性,正确性:多个线程访问某个类,不管怎么调度这些线程,其代码中不需要额外的同步或协同(synchronized),这个类依然有正确的行为。线程安全类封装了必要的同...原创 2020-03-23 13:43:01 · 3438 阅读 · 0 评论 -
【并发编程】Executor线程池框架-图文源码详解
目录0框架类图1. Executors工具类2 ThreadPoolExecutor2.1API常用方法2.1.1 构造方法2.1.2 核心方法execute(Runnable r)2.1.3 addWorker创建工作线程2.2组件解析2.2.1 worker2.2.2 ThreadFactory2.2.3BlockingQueue0框...原创 2020-03-19 18:29:26 · 343 阅读 · 0 评论 -
线程池Executor框架-源码解析
1.ThreadPoolExecutorExecutor框架最核心实现类是ThreadPoolExecutor。1.1 构造方法public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, lo...原创 2019-04-10 18:20:44 · 180 阅读 · 0 评论 -
【通信】Java NIO模型
1.可伸缩的网络服务经典BIO网络服务端代码设计 thread-per-request,每个处理都可以在独立线程中执行。存在着很多问题,为了更好的可伸缩对其进行优化。1.1 可伸缩的目标负载增加时(更多客户端连接)的优雅退化 性能随着资源(CPU、内存、磁盘、带宽)不断提高 同时满足可用性和性能目标:低时延、满足高峰需求、服务质量可调控1.2 解决方案分而治之,总体服...原创 2020-03-19 10:54:39 · 258 阅读 · 0 评论 -
【并发编程】线程生命周期
状态流转总图0.新建状态NewThread类 实现了Runnable接口 run() Runnable接口 run(),通过Thread类或线程池来使用 Callable接口 作为FutureTask构造方法参数使用 call方法,有返回值,且可以抛出异常 call方法实际是在Runnable的run方法中被执行 1.就绪状态Runnable调用线程...原创 2020-03-18 15:07:48 · 238 阅读 · 0 评论 -
【HTTPS】TLS/SSL握手失败的场景分析
0.背景知识TLS/SSL握手的过程参考SSL握手过程图解1.常见报错1.1 SSLHandshakeException handshake_failure1.1.1 TLS/SSL协议版本不匹配自从TLS 1.2版本在2008年发布以来,服务器处于安全性考虑通常也只支持较高版本TLS,比如TLS1.2及以上,如果这些客户端用低版本TLS/SSL向服务器发起握手,会因为服务器...原创 2020-03-12 11:49:36 · 4090 阅读 · 0 评论 -
【源码阅读】导入JDK源码
1.下载openjdkhttp://hg.openjdk.java.net/2.导入到IDEAFile->Project Structure看起JDK源码来非常带劲~原创 2020-03-12 11:13:46 · 204 阅读 · 0 评论 -
【bugfix】https握手失败 javax.net.ssl.SSLException: Received fatal alert: internal_error
目录1.背景2.分析过程2.1抓包2.2 控制变量3.原因4.解决方案1.背景对接外部服务使用https协议,通过浏览器和curl 7.54.0、OpenSSL 1.1.1d 10 Sep 2019都能通,但是开发机上通过commons-httpclient 3.1包通过注册ssl协议进行socket通信时,报SSLException: Received fata...原创 2020-03-12 10:47:39 · 8245 阅读 · 0 评论 -
【并发编程】synchronized实现
1.功能synchronized是用与线程同步,是一个重量级互斥锁,可以保证方法或者代码块在运行时,同一时刻只有一个线程可以进入到该对象的临界区(同一个对象的所有synchronized保卫的代码块)。synchronized是可重入的,即同一个线程,可以多次进入同个对象的多个synchronized块。2.锁对象synchronized修饰位置 锁对象 样例 实例...原创 2020-03-10 19:59:19 · 327 阅读 · 0 评论 -
【JVM】Java启动JVM
1.Java命令启动一个Java应用,Launches a Java application,具体可以用man java查看使用方法。java [options] classname [args]java [options] -jar filename [args]options是传递给VM的参数,args是传递给java main方法的参数,具体使用2.启动过程java...原创 2020-02-28 09:43:56 · 849 阅读 · 0 评论 -
面试题整理(一)
线程部分1、多线程的实现方式有哪些?这个题目在一面的时候基本上都会碰到吧,继承 Thread 类、实现Runnable、callable 接口,最后调用 的是 start() 方法来启动线程。 @Test public void testStart() { Thread B = new Thread(new Runnable() { ...原创 2020-02-27 10:54:37 · 321 阅读 · 0 评论 -
【bugFix】ASM ClassReader failed to parse class file
现象spring容器初始化失败error日志如下:Context initialization failedorg.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component classnested exception is org.springfra...原创 2020-02-27 10:50:45 · 309 阅读 · 0 评论 -
【JDK】String 字符串
1.简介String类用来表示字符串,程序中的“abc”等字符串字面量就是其实例。String是个不可变类,就是虽然它底层实现的一个字符数组,但是不能够修改字符数组的某个字符。因此它是可以多线程间共享的(线程安全的)。2.字段&构造由于String底层也是char数组,char类型在内存中是由两个字节Unicode编码(UTF-16)表示,每个字符值都在[\u0000,...原创 2020-02-21 08:57:45 · 264 阅读 · 0 评论 -
【Spring】Spring项目导入Idea
目录1.环境准备JDK 1.8gradle 4.6IDE:IntelliJ IDEA2.代码准备2.1 下载2.2 预编译3.导入IntelliJ IDEA4.效果附录1.环境准备JDK 1.8gradle 4.6可以网盘下载链接: https://pan.baidu.com/s/11YJFAK4ns9KlFFKTi3tn6A 提取码...原创 2020-02-20 09:00:33 · 2287 阅读 · 0 评论 -
普通Java程序用Maven 打jar包
目录1. 需求 2. 开发环境3. Maven配置3.1 pom.xml3.2 assembly插件配置package.xml4. 使用maven-jar-plugin打可执行jar包5. Maven使用maven-assembly-plugin装需要打包的文件打进zip包7. 解压zip,执行jar包1. 需求 普通java maven项目...原创 2020-02-14 09:16:02 · 770 阅读 · 0 评论 -
【算法】位运算
目录1.基础2.操作2.1 置位 set bit2.2 查位check bit2.3 切换位 toggle bit2.4 清除位 clear bit2.5 最右1位掩码2.6 最左1位掩码2.7 清除最右13.编程题3.1 leetcode 476. 数字的补数思路3.2leetcode201. 数字范围按位与思路求解方式1.基础...原创 2020-02-07 17:05:53 · 2320 阅读 · 0 评论 -
图解LinkedList
1.数据结构1.0 类图从类图可以发现LinkedList有多种角色,既是List线性顺序表,也是Queue队列,此外还可以当作栈使用。 继承自List、Queue 字段有first、last指针 双向节点,prev和next指针 1.1 链表first字段则是链表的head,last则...原创 2020-02-03 13:29:12 · 786 阅读 · 0 评论 -
【JVM】Java虚拟机
0.应用架构0.1 JVM VS JRE VS JDK关系0.2 JVM架构根据JVM规范,业界已有很多实现,其中最常用的是HotSpot虚拟机,1.类加载类加载机制:虚拟机把Class文件(字节码)加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被JVM直接使用的Java类型,这就是虚拟机的。2.内存管理JVM运行时用到的内存线程共享维度...原创 2019-12-27 11:08:36 · 165 阅读 · 0 评论 -
【Java】java命令使用
1.Java命令启动一个Java应用,Launches a Java application,具体可以用man java查看使用方法。java [options] classname [args]java [options] -jar filename [args]options是传递给VM的参数,args是传递给java main方法的参数1.1 选项options1....原创 2019-12-27 10:23:03 · 519 阅读 · 0 评论 -
【面试题】面试题 问题之书
一、Java基础集合HashMap 1.7和1.8的区别 源码阅读jdk1.8 ConcurrentHashMap的实现原理以及1.7和1.8的区别 Java提供的排序算法是怎么实现的?Object序列化和反序列化底层的实现原理等相关问题 new String()一共创建了几个对象? Java Integer和String内存存储常见问题 hashCode和equals相关...原创 2019-12-25 13:36:21 · 289 阅读 · 0 评论 -
【通信】NIO实现+源码解析
目录1.简介2.最简demo使用2.1 网络线程模型图2.2 demo代码3 源码分析3.1 Selector选择器3.1.1 open()创建实例3.1.2 select()遍历fd选择就绪3.2 Channel3.2.1 read读取到bufferwrite写入3.3 Buffer缓冲区3.3.1 核心字段3.3.2 demo测试3...原创 2019-12-24 17:54:44 · 1558 阅读 · 1 评论 -
【java】字符编码问题
0.常识Java的内存编码是Unicode,UTF-16 Linux 默认ISO-8859-1 Win32 默认GB2312 字符集charset:多个字符的集合。例如GB2312是中国国家标准的简体中文字符集。 字符编码(Character encoding):把字符集中的字符编码(映射)为特定的字节或字节序列的规则,以便文本在存储和在网络中传输。0.1 常用字符集&...原创 2019-12-24 10:07:13 · 368 阅读 · 0 评论 -
【bugfix】从jar包找到最低jdk、jre版本
问题背景当项目中引用高版本类库时,可能导致线程down了,由于线上(1.6)线下(1.8)jdk版本不同,引入了新的jar包,所以试着排查新jar包的类版本。排查过程1.解压jar包jar -xvf kafka-clients-0.10.0.0.jar会有一系列class文件,选择./org/apache/kafka/clients/producer路径下的一个class类文...原创 2019-12-18 16:51:54 · 301 阅读 · 0 评论 -
【java基础】SPI机制
1.简介SPI(Service Provider Interface)服务提供者机制,主要便于服务发现和动态替换,SPI机制需要遵守如下规范如Java就提供了一个标准接口 java.sql.Driver,各个数据库厂商可以实现这个接口,并提供jar包,开发者引入jar包后可以被应用程序加载。2.使用规范1).META-INF/services/ 目录第三方实现需要在j...原创 2019-12-05 17:52:37 · 274 阅读 · 0 评论 -
【分布式】zookeeper 入门
目录前言1.功能简介2.安装3.ZKshell操作命令4.基础概念5.编程demo5.1连接到ZooKeeper5.2读取操作5.3 写操作6.数据一致特点7.应用场景实例7.1 集群管理前言zookeeper主要用于协调分布式服务、 配置维护、组合管理和命名服务,通过使用类似于文件操作系统的目录结构树来维护元数据。参考官网https:...原创 2019-11-21 15:36:32 · 264 阅读 · 0 评论 -
【Java基础】可访问性VS修饰符实验
可访问性AccessibilityEffective Java中提倡我们最小化类和成员的可访问性,控制了可访问性,能够避免很多线程安全等问题,为了更好地收缩访问权限,更好地保护我们地对象,我们需要对使用什么样地修饰符能够恰好够用,不会开放更多地权限。1 访问级别访问权限 修饰符 可访问范围 private私有 private 类内部 ...原创 2019-11-19 17:15:07 · 212 阅读 · 0 评论 -
【源码阅读】技巧篇
前言开源项目很多,各式各样的源码是我们学习的宝库,而打开源码,满屏的代码和英文注释极大地降低了阅读兴趣和效率。怎样有效地提升效率,并提升兴趣呢?下面说说我自己的小技巧......1.系统架构先找到框架的官方文档,官方文档权威且可信,避免阅读二手文档的误导,还有在阅读二手文档时我尝尝会有怀疑,这会消耗你的经历。找到Get Start页面,一般会有框架或者项目的整体架构、层次依赖关系,...原创 2019-11-18 15:36:12 · 234 阅读 · 0 评论 -
【BugFix】工具推荐 FindBugs-IDEA
前言新手开发往往不能意识到自己程序中存在的bug、会导致什么问题,即使意识到也不知道怎样的代码是最佳实践,怎样修改fix能达到最好的效果。有了FindBugs这款神器能够帮助开发者在开发过程中找到bug、不规范,这种有反馈的编码才是有效的编码,否则写了再多行代码,不知道是对是错,能力和经验永远不能精进!用这款神器,慢慢地改变自己不好的编码习惯,存在的问题,慢慢习惯最佳实践,日积月累,代码能力绝...原创 2019-11-18 11:53:57 · 1135 阅读 · 0 评论 -
【Java】反射机制
Java反射手册Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息。反射还可以让我们在运行期实例化对象,调用方法,通过调用get/set方法获取变量的值。例子:Method[] methods = MyObject.class.getMethods();for(Method method : methods){ ...原创 2019-11-18 00:02:56 · 150 阅读 · 0 评论 -
【BugFix】class file has wrong version 52.0, should be 50.0
现象jdk1.8编译的高版本的类运行在低版本的jre1.6中,报错class file has wrong version 52.0, should be 50.0原因编译产生的.class文件中包含次版本号 minor_version和主版本号 major_version如写一个测试类,用jdk1.8编译之后的class文件,用javap -verbose查看,发现类主版本...原创 2019-11-25 13:09:29 · 6363 阅读 · 1 评论 -
【Spring】IOC图解-从使用到实现
Spring框架架构容器Container支撑了基本功能 包含并管理对象的生命周期和配置 AOP面向切面容器中任何对象很容易支持AOP声明性、编程式事务管理支持了事务管理功能DAO数据访问 主要是简化数据库访问,兼容各个ORM框架、事务管理实现IOC控制反转1. IOC出现的背景:耦合不可避免对象之间的多重依赖性关系,对象之间耦合度过高,牵一发而动全身。B...原创 2019-11-08 14:46:04 · 886 阅读 · 0 评论 -
【加解密】私钥文件解析
1.前言在与外部通信时,经常需要进行加解密、加签验签,加解密保证保密性,加签验签防篡改和抗否认。目前用的最多的加解密技术是非对称加密,即发送端公钥加密-接收端私钥解密;而加签验签则使用发送端私钥签名,接受端公钥验签。这些都依赖密钥,在真正的通信之前通常需要交换密钥,交换的是密钥文件,公钥文件常见的有.cer文件、.pem文件;私钥文件常见的有jks密钥库、pfx密钥库,der、pem文件,读取...原创 2019-11-07 11:21:23 · 3440 阅读 · 2 评论 -
【转义处理】Json和XML的特殊字符转义处理
0.背景一般在使用接口传输数据时通常会使用两种数据交换格式:JSON、XML。json通常用于前后端交互,xml可通过命名空间和规范check tag的层次关系,都可以很好地与对象互相转换。但是由于有的字符在格式上被用了,字段内容如果包含这些特殊字符需要进行转义!1.XML特殊字符xml的特殊字符 包括< > & "标签内容特殊 转义后 < ...原创 2019-11-06 15:11:57 · 5713 阅读 · 0 评论 -
【鲁棒】最佳实践
1.状态检查1.1 类型强制转换 检查实例类型if (value instanceof LogData) { LogData logData = (LogData)value;}1.2 迭代器 检查hasNext()for (Iterator<Foo> i = collection.iterator(); i.hasNext(); ) {...原创 2019-11-05 15:17:15 · 177 阅读 · 0 评论