
java
文章平均质量分 75
青鱼入云
这个作者很懒,什么都没留下…
展开
-
单元测试实战
JUnit是一个为Java编程语言设计的开源单元测试框架,由 Kent Beck 和 Erich Gamma建立,它是单元测试框架家族中的一个,这些框架被统称为xUnit,JUnit是xUnit 家族中最为成功的一个。:如果已经编写了一套可自动执行的单元测试代码,那么每次修改代码或重构后,只需要再自动执行一遍单元测试,就知道修改是否正确了,能够大幅提高效率和项目稳定性。:通过编写和运行单元测试,开发者能够快速验证代码的各个部分是否按照预期工作,有利于保证系统功能的正确可用,这是单元测试的核心作用。原创 2023-12-26 13:51:30 · 1700 阅读 · 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 · 1055 阅读 · 0 评论 -
面试:MyBatis问题
MyBatis呢,是Java领域中的一款持久化框架,它的主要功能是,让我们能够轻松地在Java对象和数据库之间建立联系。通过这种联系,开发者可以很方便地存储、检索和操作数据。MyBatis与其他ORM框架相比,有一些独有的特点。首先,MyBatis强调对SQL的可控性。在使用的时候,可以直接编写SQL语句,提供更精准地优化查询。还可以充分利用数据库的特性,处理各种复杂的业务逻辑。在某些情况下,这能够带来更好的性能。原创 2023-11-23 15:56:43 · 455 阅读 · 0 评论 -
判断线程池任务执行完成的方式
Thread线程是否执行完成,我们可以调用join方法然后等待线程执行完成;那在使用线程池的时候,我们如何知道线程已经执行完成了?本文就带给大家五种判断的方式:● isTerminated() 方式,在执行 shutdown() ,关闭线程池后,判断是否所有任务已经完成。● ThreadPoolExecutor 的 getCompletedTaskCount() 方法,判断完成任务数和全部任务数是否相等。● CountDownLatch计数器,使用闭锁计数来判断是否全部完成。原创 2023-11-21 20:28:06 · 1955 阅读 · 0 评论 -
如何停止一个正在运行的线程
3. 使用Thread.stop方法(不推荐使用):Thread.stop方法可以强制停止一个线程,但不建议使用它,因为它可能导致线程的状态不一致和资源泄漏等问题,容易引发不可预测的错误。4. 使用ExecutorService: 如果线程是通过ExecutorService创建的,可以使用shutdown或shutdownNow方法来停止线程池中的线程。要停止一个正在运行的线程,通常有几种方法,但需要根据具体情况选择适当的方式,因为线程的停止涉及到线程安全和资源释放等问题。原创 2023-11-21 19:19:01 · 319 阅读 · 0 评论 -
有三个线程T1,T2,T3,如何保证顺序执行
确保三个线程 T1、T2、T3 按照指定顺序执行有多种方式。这些方法都可以用来确保线程按照指定顺序执行。选择其中一种方式取决于你的具体需求和场景。原创 2023-11-21 17:46:57 · 225 阅读 · 0 评论 -
ThreadLocaL如何防止内存泄漏
ThreadLocal 变量的内存泄漏问题主要是由于 ThreadLocalMap 中的 Entry 没有被及时清理导致的。ThreadLocalMap 是 ThreadLocal 的底层数据结构,它用于存储每个线程独立的变量副本。通过采取这些预防措施,可以有效避免 ThreadLocal 变量的内存泄漏问题,确保不再需要的对象能够被及时回收。原创 2023-11-21 17:41:46 · 291 阅读 · 0 评论 -
Lambda小课堂:巧用“Function”让代码优雅起来~
在开发过程中经常会使用if…else…进行判断抛出异常、分支处理等操作。这些if…else…充斥在代码中严重影响了代码代码的美观,这时我们可以利用Java 8的Function接口来消灭if…else…原创 2023-11-21 17:16:37 · 235 阅读 · 0 评论 -
BigDecimal的常见陷阱
BigDecimal 是 Java 中的一个类,用于精确表示和操作任意精度的十进制数。它提供了高精度的数值计算,并且可以避免浮点数计算中常见的精度丢失问题。它提供了大量的方法来支持基本的数学运算,如加法、减法、乘法、除法等。它还支持比较操作和取整操作,可以设置小数位数、舍入模式等。此外,BigDecimal 还提供了一些其他功能,如转换为科学计数法、格式化输出、判断是否是整数等。适用场景:需要处理精确计算或防止浮点数计算精度丢失的场景。原创 2023-11-21 17:09:04 · 238 阅读 · 0 评论 -
如何优雅的删除HashMap元素
需要注意增强的 for 循环底层使用的迭代器 Iterator,而 HashMap 是 fail-fast 原则的错误机制,所以遍历时删除元素会出现 java.util.ConcurrentModificationException 并发修改异常。通过Iterator迭代删除元素不会出现并发修改异常,但由于HashMap是线程不安全的,这时如果多个线程同时修改HashMap数据也会出现并发修改异常 ,日常使用可以先用ConcurrentHashMap封装。所以也存在第三种方法同样的问题。原创 2023-11-21 17:01:22 · 1092 阅读 · 0 评论 -
List操作的一些常见问题
从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非常多的并发场景中使用到。在写操作(add、remove等)时,不直接对原数据进行修改,而是先将原数据复制一份,然后在新复制的数据上执行写操作,最后将原数据引用指向新数据。这样做的好处是读操作(get、iterator等)可以不加锁,因为读取的数据始终是不变的。原创 2023-11-21 16:32:55 · 608 阅读 · 0 评论 -
如何优雅的避免空指针异常
空指针异常是导致java程序运行中断最常见的原因,相信每个程序猿都碰见过,也就是NullPointException,我们通常简称为NPE,本文告诉大家如何优雅避免NPE。原创 2023-11-21 16:07:37 · 431 阅读 · 0 评论 -
了解Netty,从IO开始
从0开始学习Netty,将io、socket、reactor等netty必备知识点一一讲清楚,方便理解netty的运行模式原创 2023-10-19 17:08:12 · 372 阅读 · 0 评论 -
面试:JVM问题
jvm面试相关问题原创 2023-08-03 19:09:39 · 871 阅读 · 0 评论 -
通过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 · 5808 阅读 · 0 评论 -
记某一次某大厂面试的实时笔试题
某大厂面试实时笔试题原创 2018-09-04 11:54:20 · 5457 阅读 · 1 评论 -
创建线程的三种方式
1. 继承Thread类创建线程2. 实现Runnable接口3. 实现callable接口原创 2018-06-03 16:23:39 · 298 阅读 · 0 评论 -
Copy-On-Write写时复制机制与Java中CopyOnWriteArrayList容器源码实现
copy-on-write并发编程写时复制,解决list和set的并发读写问题 linux系统中内存的管理和分配。参考:写时复制机制 redis快照持久化(bg...原创 2018-06-03 15:16:05 · 1556 阅读 · 1 评论 -
hashmap技术概览与扩容在Java7与Java8中的不同实现
hashmap技术概览原创 2018-06-01 16:33:36 · 2743 阅读 · 3 评论 -
ReentrantReadWriteLock源码解析
ReentrantReadWriteLock是ReadWriteLock的一个实现类,具有和ReentrantLock相似的语义。但注意:并不是Lock、或者ReentrantLock的子类或实现,但ReadLock和WriteLock实现了Lock接口。 ReadWriteLock源码如下:/** * A ReadWriteLock维护一对关联的locks ,一个用于只读操作,一个用于写...原创 2018-05-24 11:44:28 · 279 阅读 · 0 评论 -
Semaphore源码解析
Semaphore:一个计数信号量。 在概念上,信号量维持一组许可证。 如果有必要,每个acquire()都会阻塞,直到许可证可用,然后获取它。 每个release() 释放一个许可证回去,潜在地释放一个阻塞获取方。 类似与限流算法中的令牌桶算法。 但是,Semaphore并没有使用实际的许可证对象; Semaphore只保留可用数量的计数,并相应地执行。 信号量通常用于限制线程数,而不是访问...原创 2018-05-20 22:39:08 · 328 阅读 · 0 评论 -
CountDownLatch源码解析
CountDownLatch:允许一个或多个线程等待其他线程中执行完成的同步辅助工具。 CountDownLatch使用一个给定的计数初始化。await方法阻塞,直到由于countDown()方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的await 调用立即返回。 这是一个一次性的现象 - 计数器无法重置。 如果您需要重置计数器的版本,可以考虑使用CyclicBar...原创 2018-05-20 21:39:22 · 251 阅读 · 0 评论 -
可重入锁ReentrantLock源码解析
ReentrantLock:一个可重入互斥Lock具有与使用synchronized方法和语句访问的隐式监视锁相同的基本行为和语义,但具有扩展功能。比如实现公平锁、超时处理、锁中断。 A ReentrantLock由最后一个成功锁定且尚未解锁的线程拥有 。当锁不是由另一个线程拥有时,调用lock的线程将成功获取锁。 如果当前线程已经拥有该锁,该方法将立即返回。 当前线程是否持有该锁可以使用...原创 2018-05-20 21:10:47 · 718 阅读 · 1 评论 -
AQS(抽象队列同步器)
一、什么是 AQS ? AQS即AbstractQueuedSynchronizer的缩写,是并发编程中实现同步器的一个框架。 AQS基于一个FIFO双向队列实现,被设计给那些依赖一个代表状态的原子int值的同步器使用。我们都知道,既然叫同步器,那个肯定有个代表同步状态(临界资源)的东西,在AQS中即为一个叫state的int值,该值通过CAS进行原子修改。 在AQS中存在一个...原创 2018-05-20 19:29:52 · 1980 阅读 · 3 评论 -
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 · 44814 阅读 · 31 评论 -
Java8中java.time包
Java8新增了date和time的util包,懒得多谢,截个图吧,其实大部分可以从类名大概知道包的作用,画红框的是常用的,如:LocalDate、Localtime这些类。写的不够全不够细,详细内容参考链接:JAVA 8:健壮、易用的时间/日期API 上面还有几个子包: java.time.chrono 年表包:里面包含很多年表,包括日本年表、泰国年表、民国、伊斯兰历等。 ...原创 2018-05-18 18:22:11 · 6830 阅读 · 0 评论 -
Lambda表达式学习与实践
最近项目从Java7升级Java8,感觉新的代码已经可以完全拥抱Java8的新特性了:Lambda表达式、函数式接口、流API、默认方法和新Date/Time Api。这里整理一点Lambda表达式的使用场景和示例。 首先声明两个重要的概念: Lambda表达式不是Java独有的概念,它代表的是一个匿名函数,是基于数学中的λ演算得名,直接对应于其中的lambda抽象(lam...原创 2018-05-17 21:48:58 · 523 阅读 · 0 评论 -
bio,io,nio
io,nio原创 2018-05-14 22:52:15 · 310 阅读 · 0 评论 -
java juc图谱
juc图谱: 1.collections 2.executor 3.atomic 4.locks 5.tools原创 2018-05-14 22:40:41 · 2499 阅读 · 1 评论 -
回调模式
回调模式: 回调模式并不在23种设计模式中,但是做java的其实是接触比较多的,在java的接口注入中,使用的就是回调模式。 比如集合排序中,使用注入Comparator比较器的方式进行排序:Collections.sort(list,new Comparator () { @Override public int compare(Objec...原创 2018-05-14 22:20:47 · 349 阅读 · 0 评论 -
springEL表达式详解及应用
什么是SpringEL? Spring3中引入了Spring表达式语言—SpringEL,SpEL是一种强大,简洁的装配Bean的方式,他可以通过运行期间执行的表达式将值装配到我们的属性或构造函数当中,更可以调用JDK中提供的静态常量,获取外部Properties文件中的的配置 为什么要使用SpringEL? 我们平常通过配置文件或Annotaton注入的Bean,其实都可以称为静态...转载 2018-05-10 17:55:40 · 57208 阅读 · 8 评论 -
CAS:利用处理器原子性来保证juc.atomic原子性
什么是CAS: CAS,Compare and Swap即比较并交换。juc包借助CAS实现了区别与synchronized同步锁的一种乐观锁。乐观锁就是每次去修改数据的时候都乐观的认为数据不会被修改,所以不会上锁,但是在更新的时候会判断一下此期间数据有没有更新。CAS有3个操作数:内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A与内存值V相同时,将内存值V修改为B,否则什么也不...原创 2018-05-03 21:54:26 · 1019 阅读 · 1 评论 -
juc的Atomic
Java从JDK1.5开始提供java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作。 原子变量的底层使用了处理器提供的原子指令,但是不同的CPU架构可能提供的原子指令不一样,也有可能需要某种形式的内部锁,所以该方法不能绝对保证线程不被阻塞。atomic使用的是cas的更新方式,当某个线程在执行atomic的方法时,不会被其他线程打断,而别的线程就...原创 2018-05-03 21:32:37 · 676 阅读 · 0 评论 -
JVM序列:jvm工具集
(1)jps: 可以查看虚拟机进程状况工具 (2)jstat: 虚拟机统计信息监视工具 jstat -gc可以查看gc,jit等统计信息 (3)jinfo: Java配置信息工具 (4)jmap: Java内存映像工具 选项 作用 -dump 生成堆转储快照 -heap 线上堆详细信息,如:使用哪种回收器、参数配置、分代状况等 ...原创 2018-05-03 20:35:30 · 389 阅读 · 0 评论 -
JVM系列:内存分配策略
(1)对象优先在Eden分配 (2)大对象直接进入老年代 (3)长期存活对象将进入老年代 (4)动态对象年龄判定 (5)空间分配担保原创 2018-05-03 20:11:08 · 324 阅读 · 0 评论 -
JVM系列:垃圾收集器
常用的有那么几种垃圾收集器,java7中大家习惯用ParNew+CMS组合分别清理新生代和老年代,java8中使用G1收集器。 (1)ParNew收集器: ParNew收集器是Serial收集器的多线程版本,新生代使用复制算法,老年代使用标记-整理算法。 (2)CMS收集器: 基于“标记-清除”算法,亿获取最短回收停顿时间为目标,适合作为服务器的收集算法。 (3)G1收集器: 与cms...原创 2018-05-03 20:09:54 · 197 阅读 · 0 评论 -
JVM系列:垃圾收集算法
复制算法: 适用于“朝生夕死”的数据,每次收集将存活的对象一次性地复制到另外一块空间上,优点是效率高、实现简单,缺点是总有一块空内存作为轮换备份,所以新生代按8:1:1分配eden和survivor,这样浪费的只有1/10的部分了。如果survivor区不够复制过去,那么就需要老年代作“分配担保”了。 标记清除算法: 垃圾回收的时候首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记...原创 2018-05-03 19:48:34 · 220 阅读 · 0 评论 -
JVM系列:java运行时数据区域
jvm的运行时数据区域按线程隔离分为两类:线程共享区与线程独占区。 我们常说的堆栈分别对应里面的Java堆与虚拟机栈。堆是线程共享的,栈是线程私有的。 (1)程序计数器:Program Counter Register 程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。 (2)Java虚拟机栈:Java Virtual Machine Stacks...原创 2018-05-03 18:21:22 · 245 阅读 · 0 评论 -
高性能场景下,HashMap的优化使用建议
1.HashMap 在JDK 7 与 JDK8 下的差别 顺便理一下HashMap.get(Object key)的几个关键步骤,作为后面讨论的基础。1.1 获取key的HashCode并二次加工 因为对原Key的hashCode质量没信心,怕会存在大量冲突,HashMap进行了二次加工。JDK7的做法:h ^= (h >>> 20) ^ (h >>&...转载 2018-05-03 10:40:46 · 1803 阅读 · 1 评论 -
记一个简单的自定义spring注解的实现方案
一个自定义注解的实现源码原创 2018-04-26 22:12:21 · 389 阅读 · 1 评论