java
文章平均质量分 75
青鱼入云
这个作者很懒,什么都没留下…
展开
-
单元测试实战
JUnit是一个为Java编程语言设计的开源单元测试框架,由 Kent Beck 和 Erich Gamma建立,它是单元测试框架家族中的一个,这些框架被统称为xUnit,JUnit是xUnit 家族中最为成功的一个。:如果已经编写了一套可自动执行的单元测试代码,那么每次修改代码或重构后,只需要再自动执行一遍单元测试,就知道修改是否正确了,能够大幅提高效率和项目稳定性。:通过编写和运行单元测试,开发者能够快速验证代码的各个部分是否按照预期工作,有利于保证系统功能的正确可用,这是单元测试的核心作用。原创 2023-12-26 13:51:30 · 1654 阅读 · 0 评论 -
BIO、NIO、selector、Netty代码Demo示例
阻塞I/O的连接accept()方法及数据读取的read()方法都是阻塞的,也就是说没有客户端发起连接时会阻塞,客户端发起连接后不发送数据也会阻塞。非阻塞I/O在客户端连接方法accept()和read()方法中都不会阻塞,我们可以通过返回值判断是否有客户端发起连接或者发送数据,进行相应的处理。通过一个多路复用器selector对channel进行管理,这样。简单的NIO因为是通过遍历的方式,会有大量的空循环。服务端处理handler。客户端处理handler。原创 2023-11-29 21:44:51 · 991 阅读 · 0 评论 -
面试:MyBatis问题
MyBatis呢,是Java领域中的一款持久化框架,它的主要功能是,让我们能够轻松地在Java对象和数据库之间建立联系。通过这种联系,开发者可以很方便地存储、检索和操作数据。MyBatis与其他ORM框架相比,有一些独有的特点。首先,MyBatis强调对SQL的可控性。在使用的时候,可以直接编写SQL语句,提供更精准地优化查询。还可以充分利用数据库的特性,处理各种复杂的业务逻辑。在某些情况下,这能够带来更好的性能。原创 2023-11-23 15:56:43 · 428 阅读 · 0 评论 -
判断线程池任务执行完成的方式
Thread线程是否执行完成,我们可以调用join方法然后等待线程执行完成;那在使用线程池的时候,我们如何知道线程已经执行完成了?本文就带给大家五种判断的方式:● isTerminated() 方式,在执行 shutdown() ,关闭线程池后,判断是否所有任务已经完成。● ThreadPoolExecutor 的 getCompletedTaskCount() 方法,判断完成任务数和全部任务数是否相等。● CountDownLatch计数器,使用闭锁计数来判断是否全部完成。原创 2023-11-21 20:28:06 · 1593 阅读 · 0 评论 -
如何停止一个正在运行的线程
3. 使用Thread.stop方法(不推荐使用):Thread.stop方法可以强制停止一个线程,但不建议使用它,因为它可能导致线程的状态不一致和资源泄漏等问题,容易引发不可预测的错误。4. 使用ExecutorService: 如果线程是通过ExecutorService创建的,可以使用shutdown或shutdownNow方法来停止线程池中的线程。要停止一个正在运行的线程,通常有几种方法,但需要根据具体情况选择适当的方式,因为线程的停止涉及到线程安全和资源释放等问题。原创 2023-11-21 19:19:01 · 201 阅读 · 0 评论 -
有三个线程T1,T2,T3,如何保证顺序执行
确保三个线程 T1、T2、T3 按照指定顺序执行有多种方式。这些方法都可以用来确保线程按照指定顺序执行。选择其中一种方式取决于你的具体需求和场景。原创 2023-11-21 17:46:57 · 177 阅读 · 0 评论 -
ThreadLocaL如何防止内存泄漏
ThreadLocal 变量的内存泄漏问题主要是由于 ThreadLocalMap 中的 Entry 没有被及时清理导致的。ThreadLocalMap 是 ThreadLocal 的底层数据结构,它用于存储每个线程独立的变量副本。通过采取这些预防措施,可以有效避免 ThreadLocal 变量的内存泄漏问题,确保不再需要的对象能够被及时回收。原创 2023-11-21 17:41:46 · 188 阅读 · 0 评论 -
Lambda小课堂:巧用“Function”让代码优雅起来~
在开发过程中经常会使用if…else…进行判断抛出异常、分支处理等操作。这些if…else…充斥在代码中严重影响了代码代码的美观,这时我们可以利用Java 8的Function接口来消灭if…else…原创 2023-11-21 17:16:37 · 145 阅读 · 0 评论 -
BigDecimal的常见陷阱
BigDecimal 是 Java 中的一个类,用于精确表示和操作任意精度的十进制数。它提供了高精度的数值计算,并且可以避免浮点数计算中常见的精度丢失问题。它提供了大量的方法来支持基本的数学运算,如加法、减法、乘法、除法等。它还支持比较操作和取整操作,可以设置小数位数、舍入模式等。此外,BigDecimal 还提供了一些其他功能,如转换为科学计数法、格式化输出、判断是否是整数等。适用场景:需要处理精确计算或防止浮点数计算精度丢失的场景。原创 2023-11-21 17:09:04 · 157 阅读 · 0 评论 -
如何优雅的删除HashMap元素
需要注意增强的 for 循环底层使用的迭代器 Iterator,而 HashMap 是 fail-fast 原则的错误机制,所以遍历时删除元素会出现 java.util.ConcurrentModificationException 并发修改异常。通过Iterator迭代删除元素不会出现并发修改异常,但由于HashMap是线程不安全的,这时如果多个线程同时修改HashMap数据也会出现并发修改异常 ,日常使用可以先用ConcurrentHashMap封装。所以也存在第三种方法同样的问题。原创 2023-11-21 17:01:22 · 679 阅读 · 0 评论 -
List操作的一些常见问题
从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非常多的并发场景中使用到。在写操作(add、remove等)时,不直接对原数据进行修改,而是先将原数据复制一份,然后在新复制的数据上执行写操作,最后将原数据引用指向新数据。这样做的好处是读操作(get、iterator等)可以不加锁,因为读取的数据始终是不变的。原创 2023-11-21 16:32:55 · 569 阅读 · 0 评论 -
如何优雅的避免空指针异常
空指针异常是导致java程序运行中断最常见的原因,相信每个程序猿都碰见过,也就是NullPointException,我们通常简称为NPE,本文告诉大家如何优雅避免NPE。原创 2023-11-21 16:07:37 · 172 阅读 · 0 评论 -
java泛型使用
java 泛型原创 2017-12-18 18:40:50 · 283 阅读 · 1 评论 -
面试:JVM问题
jvm面试相关问题原创 2023-08-03 19:09:39 · 743 阅读 · 0 评论 -
了解Netty,从IO开始
从0开始学习Netty,将io、socket、reactor等netty必备知识点一一讲清楚,方便理解netty的运行模式原创 2023-10-19 17:08:12 · 264 阅读 · 0 评论 -
jrebel+eclipse+tomcat实现热部署(带破解)
jrebel+eclipse+tomcat热部署搞了个jrebel准备热部署代码,方便以后开发web类型项目,网上找了一堆安装教程,各式各样的都有,尝试了几个,结果遇到了一堆问题,决定把正确流程贴出来。本流程是按照jrebel官网安装,但jrebel是收费的(虽然说有一个免费social版,但我没有搞出来),期间加入破解方法。第一步:下载jrebeltomcat和eclipse的安装就不说了,打原创 2016-05-10 17:29:36 · 7781 阅读 · 0 评论 -
JVM系列(一):自己编译jdk遇到的一些坑
两个月前开始学习jvm,买了本书《深入理解Java虚拟机-JVM高级特性与最佳实践——周志明著》,卡在第一章自己编译JDK,一直报错,然后便停顿了两个月,前几天再一次拾起,终于搞定。过程中惊险刺激先不说,弄完就想着把经历的坑都写出来,避免下次遇见。 再然后,便遇着了卡了我两个月的问题,看下图: 后来这个问题其实很简单就解决了,在两个月后我重新编译的时候,熟原创 2017-10-21 12:35:04 · 4135 阅读 · 2 评论 -
AQS(抽象队列同步器)
一、什么是 AQS ? AQS即AbstractQueuedSynchronizer的缩写,是并发编程中实现同步器的一个框架。 AQS基于一个FIFO双向队列实现,被设计给那些依赖一个代表状态的原子int值的同步器使用。我们都知道,既然叫同步器,那个肯定有个代表同步状态(临界资源)的东西,在AQS中即为一个叫state的int值,该值通过CAS进行原子修改。 在AQS中存在一个...原创 2018-05-20 19:29:52 · 1685 阅读 · 3 评论 -
可重入锁ReentrantLock源码解析
ReentrantLock:一个可重入互斥Lock具有与使用synchronized方法和语句访问的隐式监视锁相同的基本行为和语义,但具有扩展功能。比如实现公平锁、超时处理、锁中断。 A ReentrantLock由最后一个成功锁定且尚未解锁的线程拥有 。当锁不是由另一个线程拥有时,调用lock的线程将成功获取锁。 如果当前线程已经拥有该锁,该方法将立即返回。 当前线程是否持有该锁可以使用...原创 2018-05-20 21:10:47 · 660 阅读 · 1 评论 -
CountDownLatch源码解析
CountDownLatch:允许一个或多个线程等待其他线程中执行完成的同步辅助工具。 CountDownLatch使用一个给定的计数初始化。await方法阻塞,直到由于countDown()方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的await 调用立即返回。 这是一个一次性的现象 - 计数器无法重置。 如果您需要重置计数器的版本,可以考虑使用CyclicBar...原创 2018-05-20 21:39:22 · 227 阅读 · 0 评论 -
Semaphore源码解析
Semaphore:一个计数信号量。 在概念上,信号量维持一组许可证。 如果有必要,每个acquire()都会阻塞,直到许可证可用,然后获取它。 每个release() 释放一个许可证回去,潜在地释放一个阻塞获取方。 类似与限流算法中的令牌桶算法。 但是,Semaphore并没有使用实际的许可证对象; Semaphore只保留可用数量的计数,并相应地执行。 信号量通常用于限制线程数,而不是访问...原创 2018-05-20 22:39:08 · 285 阅读 · 0 评论 -
回调模式
回调模式: 回调模式并不在23种设计模式中,但是做java的其实是接触比较多的,在java的接口注入中,使用的就是回调模式。 比如集合排序中,使用注入Comparator比较器的方式进行排序:Collections.sort(list,new Comparator () { @Override public int compare(Objec...原创 2018-05-14 22:20:47 · 331 阅读 · 0 评论 -
java juc图谱
juc图谱: 1.collections 2.executor 3.atomic 4.locks 5.tools原创 2018-05-14 22:40:41 · 1843 阅读 · 1 评论 -
bio,io,nio
io,nio原创 2018-05-14 22:52:15 · 272 阅读 · 0 评论 -
Copy-On-Write写时复制机制与Java中CopyOnWriteArrayList容器源码实现
copy-on-write并发编程写时复制,解决list和set的并发读写问题 linux系统中内存的管理和分配。参考:写时复制机制 redis快照持久化(bg...原创 2018-06-03 15:16:05 · 1462 阅读 · 1 评论 -
创建线程的三种方式
1. 继承Thread类创建线程2. 实现Runnable接口3. 实现callable接口原创 2018-06-03 16:23:39 · 273 阅读 · 0 评论 -
ReentrantReadWriteLock源码解析
ReentrantReadWriteLock是ReadWriteLock的一个实现类,具有和ReentrantLock相似的语义。但注意:并不是Lock、或者ReentrantLock的子类或实现,但ReadLock和WriteLock实现了Lock接口。 ReadWriteLock源码如下:/** * A ReadWriteLock维护一对关联的locks ,一个用于只读操作,一个用于写...原创 2018-05-24 11:44:28 · 254 阅读 · 0 评论 -
hashmap技术概览与扩容在Java7与Java8中的不同实现
hashmap技术概览原创 2018-06-01 16:33:36 · 2582 阅读 · 3 评论 -
通过ps -ef | grep java查看到java进程相应jvm启动参数
/opt/taobao/java/bin/java-server-Xms4g-Xmx4g-XX:MetaspaceSize=512m-XX:MaxMetaspaceSize=512m-Xmn2g-XX:MaxDirectMemorySize=1g-XX:SurvivorRatio=10-XX:+UseConcMarkSweepGC-XX:CMSMaxAbortablePrecl...原创 2018-10-24 11:21:14 · 5729 阅读 · 0 评论 -
jdk中rt.jar的作用
最近看java.util.concurrent包的内容,发现java.time.、java.util.、java.nio.、java.lang.、java.text.、java.sql.、java.math.*等等都在rt.jar包下,才发现自己对平时经常用到的jdk的源码来源并不是很清晰。 我们在配置java环境变量时会配置JAVA_HOME、Path、Classpath,其中Class...原创 2018-05-20 11:17:41 · 44701 阅读 · 31 评论 -
Java8中java.time包
Java8新增了date和time的util包,懒得多谢,截个图吧,其实大部分可以从类名大概知道包的作用,画红框的是常用的,如:LocalDate、Localtime这些类。写的不够全不够细,详细内容参考链接:JAVA 8:健壮、易用的时间/日期API 上面还有几个子包: java.time.chrono 年表包:里面包含很多年表,包括日本年表、泰国年表、民国、伊斯兰历等。 ...原创 2018-05-18 18:22:11 · 6765 阅读 · 0 评论 -
Lambda表达式学习与实践
最近项目从Java7升级Java8,感觉新的代码已经可以完全拥抱Java8的新特性了:Lambda表达式、函数式接口、流API、默认方法和新Date/Time Api。这里整理一点Lambda表达式的使用场景和示例。 首先声明两个重要的概念: Lambda表达式不是Java独有的概念,它代表的是一个匿名函数,是基于数学中的λ演算得名,直接对应于其中的lambda抽象(lam...原创 2018-05-17 21:48:58 · 488 阅读 · 0 评论 -
记两次未解决的jvmCrash事件日志
同一个应用的两个实例,在某次发版后相隔7天相继crash,这次发版在正常启动后,其中一台机器,过几分钟突然连接池关闭,无法获取jdbc Connection,半小时后又自动恢复,另一台机器在四个小时后突然挂掉,此时无高负载任务。目前已知的一个可能原因是xss不够,这个结论是因为重启一直起不来,启动时报重复引用,并且会导致内存不断飙高,甚至飙满jvm分配的内存。后来调整xss384k到512k后,启...原创 2018-04-09 14:34:46 · 1361 阅读 · 0 评论 -
面试:JAVA集合问题
Java集合相关面试题原创 2018-03-30 16:19:38 · 103 阅读 · 1 评论 -
Java中transient关键字
在Java中,一个对象实现了Serilizable接口,就可以实现序列化。但是有些时候某些属性是不需要序列化的,只需要将这些字段加上transient关键字修饰,在序列化时就可以避开这些属性。 如HashMap中的一些字段:public class HashMap<K,V> extends AbstractMap<K,V> implements Map&l...原创 2018-03-30 16:24:23 · 1094 阅读 · 0 评论 -
面试:Java问题
java相关面试题public static void main(String[] args){}main方法是虚拟机访问用户程序的入口,每个程序都需要指定一个合法入口供jvm启动用户程序。public关键字,让虚拟机可以“看到”这个入口;static关键字表示不需要新建实例,可直接通过类访问;void表示虚拟机不需要返回值,因为返回值给虚拟机也不知道怎么处理;可变Strin...原创 2018-03-26 16:02:02 · 247 阅读 · 1 评论 -
面试:多线程问题
收录相关java多线程面试问题原创 2018-03-26 16:53:57 · 147 阅读 · 1 评论 -
java作用域public,private,protected及不写时的区别
简单区分下java作用域public,private,protected及不写时的区别,如下: 作用域 权限级别 同一package 子孙类 其它package public 所有权限 ✔ ✔ ✔ protected 继承权限 ✔ ✔ ✖ friendly 包权限 ✔ ✖ ✖ private 私有权限 ✖原创 2018-01-30 16:45:03 · 377 阅读 · 1 评论 -
一个项目中的Web.xml解读
web.xml文件内容分析 web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"原创 2018-01-09 20:00:51 · 878 阅读 · 0 评论 -
java方法签名
java方法签名,主要作用在于区分两个方法,即唯一确定一个方法,用于确定两个方法是否可以重载。 在java中,确定一个方法需要三个要素: 1. 调用者,也就是方法所属者,既可以是类,也可以是变量; 2. 方法名,方法的标识; 3. 形参列表,当调用方法时,系统将会根据传入的实参列表匹配。 方法重载的要求就是两同一不同:同一个类中方法名相同,参数列表不同。所以方法签名就由方法名+形参列表构...原创 2017-08-04 12:46:42 · 12271 阅读 · 3 评论