
Java
文章平均质量分 76
硅藻泥先森
爱生活、爱自由的手艺人
展开
-
Commons-Logging、Jcl-over-Slf4j、Slf4j、Logback 类图
#mermaid-svg-gvqtZeYzAnDNkmbJ .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-gvqtZeYzAnDNkmbJ .label text{fill:#333}#mermaid-svg-gvqtZeYzAnDNkmbJ .node rect,#mermaid-svg-gvqtZeYzAn原创 2021-02-03 18:03:32 · 209 阅读 · 0 评论 -
Java String、StringBuilder、StringBuffer类设计思路、实现及最佳实践
目录阅读指引0、预备知识JVM相关内存区域String类加载运行时序1、主要源码2、设计思路及实现不可变3、扩展StringBuilderStringBuffer4、最佳实践 Java与JVM术语解释及关系说明 其它阅读指引本文从源码入手,分析String类设计思路及具体实现,同时扩展分析StringBuilder、StringBuffer等相关类。0、预备知识JVM相关内存区域String类加载运行时序1、主要源码public final class String impleme原创 2021-01-21 22:01:34 · 375 阅读 · 4 评论 -
JAVA动态代理死循环原因及解决
1、代码public interface Invoker { public Object invoke(Invocation invocation);}public class EchoHandler implements Invoker { @Override public Object invoke(Invocation invocation) { return i...原创 2020-03-28 11:05:43 · 2515 阅读 · 2 评论 -
hashcode、equals、HashMap间的关系
1、从Object说起package com.hallo.collection;public class ObjectDemo { public static void main(String[] args) { Object o1 = new Object(); Object o2 = new Object(); //同一Object对象,hashCode...原创 2018-08-04 11:17:48 · 489 阅读 · 0 评论 -
InputStream类available和read方法可能读取不到完整的流数据
1、问题描述项目需要一个将网络流InputStream转换为byte[]数组的方法,于是从网上找了下面的方法: private byte[] toByteArray(InputStream input) throws IOException { byte[] buffer = new byte[(int) in.available()]; in.read(buffer)原创 2017-08-03 11:30:20 · 6109 阅读 · 4 评论 -
数据库范式
范式:英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。目前有迹可寻的共有8种范式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。通常所用到的只是前三个范式,即:第一范式(1NF),第二范式(2NF)转载 2017-07-24 17:08:03 · 221 阅读 · 0 评论 -
Java GC与内存分配策略
1、回收区域主要区域:Java堆、方法区。程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,不需要过多考虑回收的问题。2、对象是否可回收?可达性分析算法:通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没用任何引用链相连时,则证明此对象时不可用的,即该对象可回收。可作为GC Roots原创 2017-07-23 11:18:35 · 378 阅读 · 0 评论 -
线程状态图
原创 2017-07-23 19:49:20 · 273 阅读 · 0 评论 -
Java内存区域划分图
原创 2017-07-23 10:25:21 · 418 阅读 · 0 评论 -
JVM与java类的生命周期简述
简单记录下jvm对java类从加载到清除的大概过程,如下图:原创 2017-07-22 23:09:01 · 289 阅读 · 0 评论 -
Unsafe类compareAndSwapInt返回值
不聊闲,直接上代码1、代码package com.wenc.keywords;import java.lang.reflect.Field;import java.util.concurrent.locks.AbstractQueuedSynchronizer;import sun.misc.Unsafe;public class CompareAndSwapTest {原创 2017-07-08 23:44:21 · 4675 阅读 · 1 评论 -
Executor框架、线程池及其生命周期
Java类库中,任务执行的主要抽象不是Thread,而是Executor。Executor框架具有以下几个特点:异步任务执行框架基于生产者-消费者模式将任务的提交过程与执行过程解耦,用runnable表示任务采用不同的Executor实现即可改变服务器的行为,简化了代码修改的难度支持生命周期管理、统计信息收集、应用程序管理机制和性能监视等机制。 /* @since 1.5 * @原创 2017-07-15 21:26:26 · 695 阅读 · 0 评论 -
CountDownLatch源码分析
1、使用示例CountDownLatch用于实现多个线程同步,一个典型场景是:等待线程B等待N个工作线程A1、A2、...、An并发完成后,才继续往下执行。一个N=2时的示例代码如下(代码转自http://www.iteye.com/topic/1002652):package com.wenc.concurrency;import java.text.SimpleDateFormat原创 2017-07-09 09:59:53 · 249 阅读 · 0 评论 -
计数信号量Semaphore的使用
计数信号量(counting semaphore)用来控制同时访问某个特定资源的操作数量,或者同时执行某个制定操作的数量。计数信号量还可以实现某种资源池,或者对容器施加边界。特殊地,初始值为1的semaphore称为二值信号量,可以用作互斥体,并且具备不可重入的加锁语义。下面的例子实现一个资源池,将semaphore的计数值初始化为池的大小,并在从池中获取一个资源之前首先调用acquire方法原创 2017-07-15 19:45:56 · 1817 阅读 · 0 评论 -
FutureTask使用示例
FutureTask简单使用原创 2017-07-15 18:02:41 · 318 阅读 · 0 评论 -
CopyOnWriteArrayList<E>
CopyOnWriteArrayList简介CopyOnWriteArrayList,即“写入时复制”容器,在每次修改(add、remove)时都会创建新的底层基础数组,然后在新数组上修改,最后将新数组作为容器的基础数组。因此,非修改操作不需要加锁,修改操作时才加锁,并发性能较同步List好。CopyOnWriteArrayList实现以下定义了基础数组及数组操作public cl原创 2017-06-25 20:33:08 · 262 阅读 · 0 评论 -
Collections.unmodifiableMap
1、场景某些场景下需要返回不可修改Map,java容器类java.util.Collections提供了static方法unmodifiableMap来提供这个功能: /** * Returns an unmodifiable view of the specified map. This method * allows modules to provide u原创 2017-06-25 16:55:09 · 612 阅读 · 0 评论 -
Collections.SynchronizedList<E>
1、类图2、线程安全实现原创 2017-06-25 16:28:42 · 548 阅读 · 0 评论