
java
文章平均质量分 60
flushmeteor
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【设计模式】工厂模式&建造者模式
工厂模式和建造者模式的区别原创 2023-02-08 20:57:14 · 191 阅读 · 0 评论 -
java异常对性能的影响
在java中,Exception一般被认为是比较影响性能的,因此不能作为常规代码使用,而是仅仅用于处理异常情况。那么,异常到底对程序的性能有多大的影响呢?找了一些中文资料,写的不是很严谨,这篇文章Performance Effects of Exceptions in Java的方法比较好一些,可以作为参考。从结论上看,一旦产生异常,整体耗时都会比正常程序高很多。所以,平常使用Exception要比较谨慎,只在处理异常情况的场景下使用,否则会影响性能。...原创 2021-10-11 14:30:40 · 1614 阅读 · 0 评论 -
java泛型声明
在java中,泛型的使用一般限于List和Map类,自己实现的很少。具体实现可以参考廖雪峰的文章。除此之外,还有一些问题记录一下。方法上的<T> 是什么含义 public static <T> T[] copyOf(T[] original, int newLength) { return (T[]) copyOf(original, newLength, original.getClass()); }上面的代码是Arrays.copyOf方法,我们知原创 2021-10-09 14:25:07 · 1168 阅读 · 0 评论 -
java的 wait notify sleep LockSupport.park 到底怎么区分
前言之前对这些方法一直是云里雾里,最近正好看到相关的东西,赶紧重新整理一波。wait这是Object的方法,不允许重写。总结一下它的特点:带参数的是等待一定时间,不带参数的是无限等待a.wait() 的时候,当前线程一定是持有了a的锁,否则会报错;所以a.wait方法一般是在synchronized(a){}内部执行的(也可以是用其他方式获得锁)所以,就有了一个有趣的问题:notify()会立刻释放锁么?a.wait()的时候,当前线程会释放a的锁,让出cpu执行时间。但是当前线程持有的其他原创 2021-07-06 17:02:23 · 235 阅读 · 0 评论 -
ThreadPoolExecutor 是怎么控制非核心线程超时的
前言java的线程池最根本的都是使用的ThreadPoolExecutor,其构造方法的参数、线程增长顺序、拒绝策略经常在面试中被问到。但是有一个不常见的问题:keepAliveTime是怎么生效的?非核心线程是怎么超时退出的呢?其实这个问题在我们真正看完ThreadPoolExecutor的源码和逻辑之后,其实是很容易说清楚的。先说结论:在线程池里的线程会一个死循环里阻塞式地从队列里获取任务来执行,而当线程数超过核心线程数的时候,这里的阻塞时间是keepAliveTime,超过这个时间没有获取到任务原创 2021-07-06 16:01:36 · 1155 阅读 · 0 评论 -
HashMap非线程安全的表现
前言我们都知道HashMap是线程不安全的,但是具体有哪些表现呢?例子1 死循环这个是最常在面试中问到的问题,然而其实这个问题已经在java1.8版本被修复了,只在1.7版本之前存在这个问题。大致原因是在HashMap扩容的时候链表采用了头插法会使链表反序,两个线程同时扩容的话,在某种场景下会出现循环链表导致死循环。网上有很多文章介绍,有一篇写的很好,不再重复java1.8修复的方法是将头插法改成了尾插法,避免了这个死循环问题。参考文章,也可以看一下resize的代码,很容易理解。那么java1原创 2021-07-04 17:28:33 · 1221 阅读 · 2 评论 -
什么是线程安全
文章目录前言为什么说不出来到底什么是线程安全继续分析参考文章前言线程安全的概念其实大家都知道,但是如果细问却总觉得缺点系统性。一次面试的时候被问到“什么是线程安全”,瞬间有点懵逼,不知道从哪里开始说起。其实是对线程安全的认知还是不够透彻。最近,在看HashMap线程安全问题的时候,又重新思考了一遍,有一些感悟记录一下。下面记录的是了解过程,其实中间未必有用,最终结论其实是:线程安全是因为有竞态条件,导致竞态条件发生的代码区叫做临界区,对临界区内增加同步逻辑可以避免竞态条件以达到线程安全。可以直接看原创 2021-07-02 14:01:52 · 106 阅读 · 0 评论 -
Hystrix & Rxjava
文章目录前言一些文章前言项目中看到Hystrix和Rxjava的使用,了解了一下这两个东西的使用,简单记录一下资料。Hystrix是用来做熔断和限流的框架,现在已经不维护了,里面的实现用到了很多Rxjava的东西。Rxjava是反应式编程的一个工具包,在安卓中很常用。一些文章项目里只用到了Hystrix的降级功能,没有用到熔断;降级逻辑是通过继承HystrixCommand并实现getFallback方法来做到的。在排查问题的时候发现触发了降级逻辑,但是不知道是什么异常导致的,于是找到一篇文原创 2021-06-10 15:32:09 · 333 阅读 · 0 评论 -
IDEA debug工具的使用
背景 一直以来,在IDEA上使用debug工具都只会单步调试,连调试的时候使用表达式都是看同事操作才刚学会。对于java程序员来说,对于IDEA的使用度如此浅薄实在是说不过去。 最近看了一篇文章,写的简直太好了,对于每个功能都有详细介绍和动图示例。收获颇多,记录一下。问答记录 由于文章中已经有很详细的介绍了,且读的过程非常顺畅,不需要重新写一篇文章,所以通过问答的方式记录一下收获。(1)最主要的收获是什么最主要的收获有:a、知道了有四种断...原创 2021-05-08 10:52:29 · 541 阅读 · 0 评论 -
jvm方法调用指令
背景 之前看jvm指令的时候,看到各种invokexxx指令,没区分清楚到底什么区别,正好看《深入分析java web技术内幕》这本书,里面也讲到了这部分,正好回顾并整理一下。5种方法调用指令 一共有5种方法调用指令。invokestatic:调用静态方法invokespecial:调用<init>方法、private方法、super方法invokevirtual:调用虚方法invokeinterface:调用接口方法invokedynami...原创 2021-03-10 10:22:06 · 195 阅读 · 0 评论 -
jvm出core的查看方法
jvm出core的时候,查看方式,可以用gdb,也可以用jstack和jmaphttps://cloud.tencent.com/developer/article/1407569https://www.jianshu.com/p/559f939d7931gdb调试时的问题Missing separate debuginfos, use: debuginfo-install glibc-XXXhttps://blog.youkuaiyun.com/testcs_dn/article/details/1956原创 2021-03-04 14:49:28 · 591 阅读 · 1 评论 -
java Timer和ScheduledExecutorService区别
前面写了java Timer源码走读,算是搞懂了java中Timer的实现原理,之前对于定时任务,一直使用Timer,后来面试中被问到Timer和ScheduledExecutorService什么区别,一脸懵逼,之前都没想到这两个有什么关系。 一开始其实就只把ScheduledExecutorService当做是线程池,只是具备了调度定时任务的能力。但是从使用场景的角度来看,其实这两个确实很像,都是为了调度定时任务而产生的,只是使用的实现方法不一样。 ...原创 2021-01-11 12:30:15 · 807 阅读 · 0 评论 -
java Timer源码走读
前言 之前一直很好奇java的定时器到底是怎么做的?是启动了一个线程,隔一段时间执行一下传入的方法吗(不是)?怎么实现隔一段时间执行一次的逻辑的,是sleep一定时间吗(不是)? 现在终于知道看一下源码了,没想到逻辑竟然如此简单。。。例子import java.util.Timer;import java.util.TimerTask;public class Test { public static void main(String[] arg...原创 2021-01-05 21:23:38 · 209 阅读 · 0 评论 -
Double精度问题
在开发中我们会经常遇到double计算和比较的情况,之前也知道计算机对于double的表示方法是有精度损失的,但是一直不知道该怎么去避免这个问题。写c++的时候看到过用两个数值求差,小于某个阈值就认为这两个数字是相等的,那么java里该怎么解决这个问题呢? double精度问题解释:https://blog.youkuaiyun.com/wcxiaoych/article/details/42806313 double精度问题解决:https://zhuanlan.z...原创 2021-01-05 17:59:21 · 890 阅读 · 0 评论 -
maven 使用provided导致idea在本地运行程序报错
1、报错 本地运行程序报错java.lang.ClassNotFoundException2、原因:provided pom里使用的依赖包指定了 <scope>provided</scope>。 provided的含义是这个依赖只在编译和测试的时候使用,在打包运行的时候不用,这是用来避免包冲突的。 但是,不知道为什么,编译和测试的时候并不能找到这个依赖包,导致本地运行出错。3、解决 有多个方法,但是最有效的方法是这个...原创 2020-12-18 12:01:24 · 3303 阅读 · 2 评论 -
java 八进制和十六进制的表示
背景最近从hbase中查询数据,用工具查询的时候发现返回结果是\x12\x34这种格式的数据,刚看的时候一脸懵逼,这是啥?怎么解析?后来同事一看就说是16进制,我才反应过来这种格式是什么。。。说来惭愧,竟然连16进制的表示方法都不清楚,赶紧总结一波。java和c对于16进制和8进制的数据表示方法都做了规定,16进制的数据有前缀0x,8进制的数据有前缀0.public class Test { public static void main(String[] args) {原创 2020-12-09 10:31:24 · 1005 阅读 · 1 评论 -
URLClassLoader加载远程jar包
背景 有一个网友看了我的《Flink的classLoader加载机制(推测)-- 记一次程序问题中的探索》这篇文章,向我提问了一个问题,虽然这个问题我没有解决,但是我打算做一个小实验来验证一下解决思路的可行性。问题如下: 实验 因为我现在没有一套随便实验的flink集群,也没有阿里云的oss,所以就只好做个最简单的实验,证明我是可以从远程加载jar包然后使用jar包中的类的。 首先,需要先创建一个maven工程,创建一个类叫...原创 2020-10-16 10:44:43 · 3945 阅读 · 2 评论 -
HashMap的key是对象!
标题即结论,java中HashMap的key是对象,需要谨慎操作。背景 最近遇到(其实是亲手写出的)一个小bug,用HashMap<Integer, Boolean>存储了一些东西,但是在get数据的时候,key用的是long类型,导致结果读不出来。实验 用一个小实验说明一下public class Test { public static void main(String[] args) throws ParseException {...原创 2020-10-15 16:50:39 · 2653 阅读 · 0 评论 -
java泛型的类型擦除几个问题
写ArrayList源码学习笔记(3)的时候发现了ArrayList因为泛型擦除而导致元素存储使用的是Object数组。然后又了解到泛型出现之后存在类型转换的问题,所以研究了java泛型的逆变、协变&不变。后来又想到几个问题如下:(1)java为什么要做类型擦除?(2)java是如何做的类型擦除?(3)类型擦除之后,是怎么在后续使用过程中识别类型的?于是搜到了这两篇文章解决了疑惑:Java 泛型,你了解类型擦除吗? 知乎问答(1)了解到的原因是为了做兼容,引入泛型之后..原创 2020-09-03 20:00:44 · 205 阅读 · 0 评论 -
java泛型的逆变、协变&不变
背景 在看ArrayList源码的时候,发现ArrayList是支持泛型的,但是它的数据存储用的却是Object[],然后了解到这是因为java在编译的时候有类型擦除。然后研究类型擦除的时候发现java对于泛型使用有限制,里边提到了协变。然后去看协变,就发现了有逆变、协变和不变。 其实之前看代码的时候也会发现,有些地方使用泛型的时候会用<? extends T> 和 <? super T> 这种形式,当时就没有理解这个东西倒是是干什么用的。这次正好学习了一...原创 2020-08-27 15:49:21 · 462 阅读 · 0 评论 -
java注解入门简介
最近慢慢接触java的注解,注解提供了很灵活的功能,但是对于刚接触的人来说总是一头雾水,不知道是干什么的。看了一些博客,发现这篇写的很好,也可能是看了其他文章有一些概念了。这篇文章介绍的更系统一些,就有了更多的理解。注解的设计目的java项目中会经常用到各种配置,普遍使用的是xml文件来进行配置管理。xml文件管理配置的方式耦合度低,但是管理复杂度高。而注解是采用了高耦合的方式,降低了复杂度。二者各有优劣,但是注解现在能如此流行,必然是戳中了程序员的痛点的。注解的原理下面这些是从原创 2020-07-24 11:13:13 · 121 阅读 · 0 评论 -
java内存分析工具-jmap/jstat/jvisual vm/mat -- 记一次Flink任务OOM问题的解决
背景:最近用到flink做项目,程序在线上遇到了内存持续增长最后导致OOM的问题;还有一种情况是内存增长过高,在触发GC的时候产生超长停顿使taskmanager失去心跳而导致任务失败。OOM问题比较难查,幸亏有团队的小伙伴一起帮着查询并解决。记录一下查询过程和中间用到的内存分析工具使用方法,以前很少用到这些工具,现在频繁使用,发觉其实也不是那么高深莫测。堆dump首先,对于内存超高的进程进行堆dump。命令如下:jmap -dump:format=b,file=xxx pid..原创 2020-06-07 16:23:36 · 1529 阅读 · 0 评论 -
java ThreadLocal简介与原理
网上看到很多ThreadLocal的文章,感觉上来就开始讲原理,根本不讲这是个啥。当然可能他们都知道这是个什么东西,用在什么场景下,为什么需要它出现;而我不知道……ThradLocal是什么还是借用别人的说法:(1)ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态...原创 2020-04-05 16:58:54 · 170 阅读 · 0 评论 -
发布或重启线上服务时抖动问题解决方案
转载自https://www.cnblogs.com/LBSer/p/3703967.html这篇文章非常好,用一个实例介绍了如何对线上进程进行分析。一、问题描述 在发布或重启某线上某服务时(jetty8作为服务器),常常发现有些机器的load会飙到非常高(高达70),并持续较长一段时间(5分钟)后回落(图1),与此同时响应时间曲线(图2)也与load曲线一致。注:load...转载 2020-04-04 16:51:28 · 178 阅读 · 0 评论 -
一个jvm中的类只能加载一次?
在网上看到有些人说“一个类在一个jvm中只能加载一次”,对此产生了怀疑。另外,在用flink、spark做计算的时候,有一个疑惑,如果用相同的jar包启动了相同的任务,而这两个任务被分配到了同一个进程的不同线程里,是不是意味着这两个任务是共用类的?如果是这样,写flink程序的时候,操作类成员变量岂不是成为一种很危险的动作?然后我就尝试去研究了一下flink的源码,只看到了一小部分,...原创 2020-03-14 17:32:59 · 2355 阅读 · 0 评论 -
java的深拷贝和浅拷贝
java的Object类有一个clone()方法,这个方法可以实现对象的拷贝。但是这个拷贝是浅拷贝。浅拷贝和深拷贝有什么区别?从字面来看,浅拷贝就是只拷贝表面,比较浅;而深拷贝可以拷贝的更彻底。clone()为什么是浅拷贝?clone()对当前对象创建了一个新对象,但是新对象中的成员变量都是从当前对象中做的副本。如果当前对象中的成员变量存在非基本类型变量,比如你自己创建的Perso...原创 2020-03-11 21:48:15 · 143 阅读 · 0 评论 -
volatile原理及使用场景
以前一直困惑于volatile到底有什么功能、怎么使用。多方搜索资料,终于理清了头绪,记录一下。首先,volatile有两个作用:(1)保证变量的可见性(2)防止指令重排序。这两个作用都是通过设置内存屏障实现的。防止指令重排序这个很好理解,对一个变量可能有多种操作,如果使用操作在赋值操作之前发生,就会导致数据错误甚至空指针等问题。一直以来最困惑的还是第(1)个作用,volatil...原创 2019-12-25 11:17:24 · 419 阅读 · 0 评论 -
i++ 或 ++i 是原子操作吗?
前面写了一篇文章,讨论了i++和++i的区别(https://blog.youkuaiyun.com/lijianqingfeng/article/details/103474225)。该文的前提都是不存在并发的情况,通过i++ 和++i编译后的代码分析其执行效果。public class Test { private static volatile int count = 0; pu...原创 2019-12-23 14:46:47 · 3251 阅读 · 3 评论 -
HashMap的tableSizeFor
最近看HashMap的源码,发现一个tableSizeFor方法,看了半天始终不知道是在做什么,遂上网查资料。理解之后,只能拍手叫绝。记录一下,时常查看。代码如下:static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= ...原创 2019-12-17 09:39:31 · 168 阅读 · 0 评论 -
关于i++和++i (java)
记得之前上学的时候,老师讲过i++和++i的区别是:i++后执行加法,++i是先执行加法。但是之前有一个疑问,如果这个命令放到一个表达式里,所谓的i++的后执行是在表达式最后执行吗?面试的时候也总会遇到一个问题:i=i++最后的结果是什么?所谓源码之前,了无秘密。我们从汇编看一下就知道到底答案是什么了。试验1:i=i++试验2:i=++i试验3:i=i++ + i++publ...原创 2019-12-23 13:05:26 · 375 阅读 · 0 评论 -
用hibernate操作数据库时,由于字段名称设置问题导致报错
创建的表里边有几个int型的原创 2014-06-27 21:06:50 · 1628 阅读 · 0 评论 -
org.dom4j.DocumentException: Connection timed out
用ssh写的一个小项目,经常原创 2014-06-29 14:23:48 · 1742 阅读 · 0 评论 -
hibernate懒加载的问题,failed to lazily initialize a collection of role
今天往项目里添加了一个many-to-many的关联,发现即便是设置原创 2014-06-29 16:29:23 · 1086 阅读 · 0 评论 -
hibernate多对多中间表含有其他属性的配置
hibernate的多对多映射只能通过原创 2014-06-30 10:09:54 · 4162 阅读 · 1 评论 -
jsp报Syntax error, insert "}" to complete MethodBody错误
用myeclipse写jsp,发现了如标题的错误,而且是报在第一行,第一行根本原创 2014-07-04 09:39:45 · 12986 阅读 · 4 评论 -
表单中get和post的中文乱码问题
用struts写的一个项目中,前台有一个超链接向后台发送请求并传递包含中文的变量值。结果出错了。原创 2014-10-20 20:51:18 · 486 阅读 · 0 评论 -
jdk环境变量配置问题
今天重新安装jdk,在网上搜了个文章就照着配置起来,结果配置完了,java命令能用,javac不能用。 在网上查了好多资料,都说是classpath配置出错了,然后,又找了别的资料配置了一下,还是同样的出错,奔泪! 最后,突然想起来,以前遇到过这样的错,在定义JAVA_HOME变量的时候,习惯性的在后面加了个分号!! 这个原理是这样的:JAVA_HOME就是定义了一个原创 2014-03-06 20:44:23 · 660 阅读 · 0 评论