
java
文章平均质量分 79
JAVA探索
对知识的贪婪是我前进的动力
展开
-
浅谈Java引用
引用在我们的开发工作中,引用无处不在,可以说我们的工作就是通过引用来对对象进行各种操作。在JDK的<java.lang.ref>包下对引用进行了定义Reference,在源码中对引用定义了四个状态,分别是活跃(Active)、挂起(Pending)、入队(Enqueued)、死亡(Inactive)。正常来说,每个引用的生命周期都会经历这四个状态。生命周期构造函数T referent:引用的对象,被GC特殊处理的对象。ReferenceQueue:即将销毁的引用队列,在创建引原创 2021-08-03 15:28:54 · 343 阅读 · 0 评论 -
详解ThreadLocal
ThreadLocal 线程本地变量ThreadLocal被定义在jdk的<java.lang>包下面,他的作用在于辅助开发者操作线程本地变量,让我们可以在繁琐复杂的方法调用链中灵活的获取线程本地变量,而不用通过鸡肋的引用传递来获取N层调用次数之前的栈内变量。那为什么说他是辅助呢?因为真正的线程本地变量是通过ThreadLocalMap来储存的,而ThreadLocal封装了从当前线程中获取ThreadLocalMap的方法,我们可以通过get()、set(T)方法方便的对当前线程的栈内变量进原创 2021-08-03 12:25:10 · 430 阅读 · 1 评论 -
面试题总结(持更)
JVMclass 加载过程(class->loading->linking->initializing->gc) 静态变量的赋值过程(先默认后初始化) 双亲委派机制是什么,为什么要用双亲委派(安全) 怎么实现一个自定义的类加载器(extends ClassLoader overwrite findClass defineClass) lazyloading(5种情况) 解释模式/JIT编译模式(-Xmixed(检测热点代码 -XX:CompileThreshold=10原创 2020-06-14 19:01:30 · 215 阅读 · 0 评论 -
HashMap面试总结
底层数据结构HashMap底层数据结构是节点数组,节点可能是链表也可能是红黑树。当节点的数量超过8个,则转换为红黑树,当红黑树节点小于6个时,转换为链表。初始容量不指定初始容量时,默认容量为16。指定容量时,通过>>>配合|运算得到大于等于指定容量的2的N次幂,如果这个值大于等于最大容量(1<<<30),则设置为最大容量,否则设置为该值。扩容HashMap的扩容是根据扩容阈值来做的,决定扩容阈值的因素有两个,一个是扩容因子,一个是原始容量。扩容因子原创 2020-08-10 23:55:25 · 188 阅读 · 0 评论 -
ArrayList单线程下安全移除元素的几种方式
概述ArrayList是线程不安全的集合,所以这里之分析单线程下的快速失败与安全失败场景,记录一下,避免以后开发过程中采坑。总结总结放在前面,方便每次查看。场景 快速失败 安全失败 fori list.size(), remove(index) √ fori list.size(), remove(Object) √ fori int, remove(Object) √ iterator.remove() ...原创 2020-08-02 22:38:49 · 1196 阅读 · 0 评论 -
BufferedOutputStream 原理及追踪内核调用
BufferedOutputStream是采用装饰器模式对FileOutputStream进行一些功能的添加。UML类图FileOutputStreamwrite方法源码: /** * Writes <code>b.length</code> bytes from the specified byte array * to this file output stream. * * @param b .原创 2020-08-01 14:40:05 · 429 阅读 · 0 评论 -
juc 之 CountDownLatch 倒数解锁
package com.tangjianghua.juc.class003_alllock;import java.util.ArrayList;import java.util.concurrent.CountDownLatch;/** * CountDownLatch:门闩,倒计时解锁 * await()阻塞当前线程,知道CountDownLatch减到0 * @author tangjianghua * date 2020/6/23 * time 11:50 */public.原创 2020-06-23 16:56:48 · 249 阅读 · 0 评论 -
juc 之 CyclicBarrier 栅栏
package com.tangjianghua.juc.class003_alllock;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;/** * CyclicBarrier:篱栅,栅栏 * 栅栏上绑定一个任务,当有足够的线程到达栅栏时,触发栅栏的任务。 * 多个线程通过栅栏,当有足够的线程到达栅栏的某一阶段时,栅栏的这个阶段放行。 * @auth.原创 2020-06-23 16:55:46 · 288 阅读 · 0 评论 -
juc 之 LockSupport 锁工具
public static void main(String[] args) { final Thread thread = new Thread(() -> { System.out.println("阻塞"); LockSupport.park(); System.out.println("已解锁"); }); thread.start(); try { .原创 2020-06-23 16:54:25 · 200 阅读 · 0 评论 -
juc 之 Exchanger 交换器 交换两个线程中的变量
package com.tangjianghua.juc.class003_alllock;import java.util.concurrent.Exchanger;/** * @author tangjianghua * date 2020/6/23 * time 16:48 */public class ExchangerTest { static Exchanger<String> exchanger = new Exchanger<>(); .原创 2020-06-23 16:51:21 · 223 阅读 · 0 评论 -
juc 之 Semaphore控制线程并发量
public static void main(String[] args) { //创建一个Semaphore,指定并发量为2,公平竞争 final Semaphore semaphore = new Semaphore(2, true); for (int i = 0; i < 10; i++) { new Thread(()->{ try { s.原创 2020-06-23 16:46:10 · 174 阅读 · 0 评论 -
juc之phaser阶段锁
package com.tangjianghua.juc.class003_alllock;import java.util.concurrent.Phaser;/** * Phaser 阶段锁 * 注册5个线程,分四个阶段完成 * @author tangjianghua * date 2020/6/23 * time 15:55 */public class PhaserTest { static final WarPhaser marriagePhaser = ...原创 2020-06-23 16:36:18 · 256 阅读 · 0 评论 -
GC常用参数
### GC常用参数* -Xmn -Xms -Xmx -Xss 年轻代 最小堆 最大堆 栈空间* -XX:+UseTLAB 使用TLAB,默认打开* -XX:+PrintTLAB 打印TLAB的使用情况* -XX:TLABSize 设置TLAB大小* -XX:+DisableExplictGC System.gc()不管用 ,FGC* -XX:+PrintGC* -XX:+PrintGCDetails* -XX:+PrintHeapAtGC* -XX:+PrintG.原创 2020-06-14 19:40:25 · 1149 阅读 · 0 评论 -
java.util.concurrent学习(一) Executor框架认识
concurrent包提供了一系列线程池执行框架,我们可以根据需求使用concurrent下的工具类和线程池,实现线程池,定时任务执行线程池,可返回结果线程等特别实用的业务代码,这给我们开发多线程提供了很大的便利。下面我们来认识一下这个多线程框架,首先看一下大致的框架结构图。Executor是executor框架的最顶层接口,该接口只定义了execute方法,并用Runnable来表...原创 2020-05-21 16:12:12 · 227 阅读 · 0 评论 -
java内存泄漏与内存溢出
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。memory leak会最终会导致out of memory!参考:https://www.cnblogs...原创 2020-04-15 13:41:50 · 152 阅读 · 0 评论 -
记录一个常用jvm启动参数
-Xss1m -Xms256m -Xmx512m -XX:NewRatio=4 -XX:MetaspaceSize=20.8m -XX:MaxMetaspaceSize=512m -XX:-OmitStackTraceInFastThrow -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9998 -Dcom....原创 2019-12-31 16:20:21 · 209 阅读 · 0 评论 -
jvm 参数解释
-server添加该指令,表示使用Java HotSpot Server Virtual Machine (server VM) 代替Java HotSpot Client Virtual Machine (client VM)。jvm虚拟机有两种模式,一种是server,一种是client。在64位操作系统中,jvm默认采用server模式。可以通过命令java -version查看jav...原创 2019-08-22 14:54:32 · 1103 阅读 · 0 评论 -
JAVA I/O系统 Thinking in Java 之 输入/输出
“流”代表了任何可以产出数据的数据源对象(输入流)和可以接收数据的接收端对象(输出流),这一点当你从程序的角度来说就不难理解了,当你想要读取数据的时候,需要从一个数据源那里读取数据输入到程序内存中,当你想要写数据的时候,需要将程序内存中的数据输出到一个接收端中。“流”屏蔽了实际的I/O设备中处理数据的细节,让java开发者不用关注具体的数据处理,只需要使用jdk提供的类来进行数据操作。java...原创 2019-12-12 12:29:04 · 195 阅读 · 0 评论 -
JAVA I/O系统 Thinking in Java 之 File类
File类的文件具有一定的误导性,我们可能会认为它指代的是文件,实际上并非如此。它技能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。如果它指的是一个文件集,我们就可以对此集合调用list()方法,从而获取一个目录下的所有文件名称。实际上,FilePath是一个更好的名字。1.目录列表器这里尝试获取一个目录下的全部文件和部分文件,首先获取目录下所有的文件名称。 publ...原创 2019-12-10 21:10:19 · 229 阅读 · 0 评论 -
JAVA I/O系统 Thinking in Java
对程序语言的设计者来说,创建一个好的输入/输出(I/O)系统是一项艰难的任务 。 --《Thinking in Java》JAVA I/O对java开发者来说一直是一个重点中的重点,复杂的JAVA I/O系统常常让初学者望而却步。在充分理解并运用JAVA I/O之前,我们需要学习大量的类。本文是根据Thinking in Java的章节来学习的,有条件的同学可以看一看原著,会对本文有更详细的理...原创 2019-12-10 21:10:39 · 192 阅读 · 0 评论 -
程序包com.sun.image.codec.jpeg不存在
问题:编译项目时报:程序包com.sun.image.codec.jpeg不存在原因:由于编译的依赖JDK版本过高引起的。从JDK1.7开始,com.sun.image.codec.jpeg这个类被删除,所以编译总是报错。解决方法:1.采用jdk1.6编译2.加包:将JAVA_HOME/jre/lib下的rt.jar和jce.jar放到JAVA_HOME/lib下...原创 2019-11-26 14:56:02 · 964 阅读 · 0 评论 -
JAVA主流集合框架
一、IterableJava集合的顶级接口之一,内部定义了三个方法。1.获取集合的迭代器Iterator<T> iterator();2.遍历集合,并指定消费方法(default方法)。forEach(Consumer<? super T> action);3.获取分割器(default方法)。default Spliterator<T>...原创 2019-11-25 14:35:17 · 188 阅读 · 0 评论 -
java 关键字整理
变量修饰符transienttransient关键字标记的成员变量不参与序列化过程,Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被序列化的时候,transi...原创 2019-08-06 13:44:12 · 180 阅读 · 0 评论 -
java.util.concurrent学习(六) AbstractExecutorService
AbstractExecutorService是ExecutorService的默认实现类,通过新建FutureTask来实现。AbstractExecutorService提供了两个由protected修饰的方法来新建任务,这两个方法分别是: protected <T> RunnableFuture<T> newTaskFor(Runnable runnable,...原创 2019-06-02 15:59:11 · 349 阅读 · 0 评论 -
java.util.concurrent学习(五) CompletionService,ExecutorCompletionService 代码认识
CompletionServiceCompletionService,一个顶层接口,主要用于将线程池中已完成的线程区分出来,从而提高批量执行任务的效率。该接口设计了五个方法:1.submit(Callable<V> task);提交Callable任务2.submit(Runnable task, V result);提交Runnable任务。3.take();获取下一...原创 2019-06-02 15:30:06 · 758 阅读 · 0 评论 -
java.util.concurrent学习(四) FutureTask
FutureTask是一个实现了RunnableFuture的任务类,而RunnableFuture又同时继承了Runable,Future接口,那么这就说明,FutureTask同时具备了Runable,Future的属性。FutureTask生命周期FutureTask内部维护了Callable<V> callable 需要执行的任务,Object outcome ...原创 2019-06-02 14:14:39 · 857 阅读 · 0 评论 -
java.util.concurrent学习(三) Future
Future是一个定义了包含一个任务取消以及返回结果获取等方法的接口,是所有java.util.concurrent包下实现任务的最基层的接口。他定义的方法有:1.boolean cancel(boolean mayInterruptIfRunning); 取消任务的执行,当参数mayInterruptIfRunning为false时,取消还没有开始执行的任务,已经开始执行的任务继续执行。当参...原创 2019-06-02 12:13:46 · 339 阅读 · 0 评论 -
java.util.concurrent学习(二) ExecutorService
ExecutorServiceExecturoService是对Executor的扩展接口,额外定义了线程池生面周期的相关方法。1.void shutdown(); 有序的关闭线程池,该方法只保证已提交的正在执行的任务执行完成,并不保证所有的已提交的任务都会执行完成,并且在这期间不再接受新的任务。多次调用并不会有额外的效果。2. List<Runnable> shutdo...原创 2019-06-01 18:34:16 · 257 阅读 · 0 评论 -
java Thread的生命周期及源码学习
相信所有java工程师对Thread类都已不再陌生,这篇文章主要是对Thread类的一些方法使用进行描述解读,算是跟大家分享一下知识,同时自己也在学习一遍。我们就按一个线程的生命周期开始解读吧。 新建(NEW) 当程序计数器执行了new Thread方法以后,一个新的线程就创建了,此时这个thread处于新建状态。Thread类提供了九个构造方法来创建实例。1.public Th...原创 2019-05-28 20:01:38 · 234 阅读 · 0 评论 -
Java实现多线程的四种方式
Java目前的线程有两种,一种是通过实现Runable接口的方式,一种是通过实现Callable<T>的接口的方式。区别在于实现Callable<T>接口执行的线程可以很方便的获取到线程的返回对象T,同时,Callable的执行方法允许有异常抛出。我们通过这两种方式来说明现有的新起一条线程的方式: 实现Runable接口,重写run方法,构建Thread. 1...原创 2019-05-27 22:25:18 · 211 阅读 · 0 评论 -
HashMap原理
为什么要针对HashMap做一篇文章,一方面是因为面试中经常被问到这个问题,另一方面主要是在工作中经常用到HashMap,既然经常用到,不能不懂它的原理啊。 定义 * Hash table based implementation of the <tt>Map</tt> interface. This * implementation provides a...原创 2019-05-26 22:24:47 · 857 阅读 · 0 评论 -
JAVA int类型 获取高低位
去年笔者和一个硬件厂商调试打印机的时候遇到这个一个问题,厂商需要打印报文中传输报文的长度标志,将长度的高位和低位放到两个字节里,笔者由于基础知识不牢固,在这个问题上浪费了较长时间,今年开始写博客了,就记录一下这个问题。首先,int类型在java中是4个字节,每个字节8位,即int是32位的数据类型。int的高位为前三个字节,低位为最后一个字节(为什么这样组装笔者查了一些资料,理解的还不是很透彻...原创 2019-05-24 17:20:12 · 6190 阅读 · 0 评论 -
java原生锁 synchronized
synchronized是java语言的关键字。周志明在《深入理解java虚拟机.JVM高级特性与最佳实践》中曾经对synchronized的实现原理进行了详细的说明。笔者在这里引入一些来进行说明。synchronized关键字经过编译后,会在同步块的前后分别形成monitorenter和monitorexit两个字节码指令,这两个字节码都需要一个reference类型的参数来指名要锁定和解锁...原创 2019-06-02 18:12:41 · 665 阅读 · 0 评论 -
java.util.concurrent学习(八) AbstractQueuedSynchronizer 内部类Node ,ConditionObject
NodeNode是一个节点类,是AbstractQueuedSynchronizer实现队列的基础单位,内部定义了volatile Node prev、volatile Node next分别指向前一个节点和后一个节点,这样便实现了双向链表或者叫双向队列,而每一个节点都有一个状态属性waitStatus,状态包括了0、CANSELLED、SIGNAL、CONDITION、PROPAGATE五...原创 2019-06-08 17:27:25 · 467 阅读 · 0 评论 -
java 字符类型判断整理 char
1 是否是中日韩文字Character.isIdeographic(char ch);2 是否是中日韩标点符号 主要用来判断"。" 注意经常用到的不一定是中日韩标点符号,比如","Character.UnicodeBlock.of(char ch) == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION;3 是否...原创 2019-07-13 10:04:57 · 1200 阅读 · 0 评论 -
JVM调优之jmap
jmapjdk自带工具,打印给定进程、核心文件或远程调试服务器的共享对象内存映射或堆内存详细信息。如果给定的进程在64位虚拟机上运行,则可能需要指定-j-d64选项,eg: jmap -J-d64 -heap pid。此实用程序不受支持,可能在JDK的未来版本中可用,也可能不可用。在不存在dbgeng.dll的Windows系统中,需要安装“Debugging Tools for Wind...原创 2019-07-09 00:13:08 · 977 阅读 · 0 评论 -
java.util.concurrent学习(七) ThreadPoolExecutor
ThreadPoolExecutor继承了AbstractExecutorService,是线程池工厂Executors创建线程池的主要实现方式。通过线程池工厂可以快速创建线程池,然而这种方式也有一定的弊端。例如:Executors.newFixedThreadPool(int nThreads)创建的线程池核心线程数固定,不能灵活地扩展最大线程数;newCachedThreadPool方式将最大...原创 2019-07-07 22:37:16 · 359 阅读 · 0 评论 -
自制面试题
1.位运算符运算符 算法 &(与) 如果相对应位都是1,则结果为1,否则为0 |(或) 如果相对应位都是0,则结果为0,否则为1 ^ (异或) 如果相对应位值相同,则结果为0,否则为1 ~(非) 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 << (左移) 按位左移运算符。左操作数按位左移右操作数指定的位数...原创 2019-07-07 22:30:34 · 135 阅读 · 0 评论 -
java retry使用
在看ThreadPoolExecutor源码时第一次遇到retry的用法,上网查了一下,大家都是在同一个地方遇到(看来大家的求经之路都差不多...),学习了以后来做个笔记,避免脑容量太小溢出了。首先retry不是java关键字,只是一种用法,你可以自己去命名标记。其次retry是一种“移植”跳出循环标记的用法,这个标记常常伴随循环出现,不允许单独使用。之所以说他是“移植”跳出循环标记,是因...原创 2019-07-07 22:22:49 · 421 阅读 · 0 评论 -
java.util.concurrent学习(十) ReadWriteLock,ReentrantReadWriteLock
Lock框架ReadWriteLockReadWriteLock是读写锁的顶端接口,定义了获取读锁和写锁的方法。ReentrantReadWriteLock锁的实现基础SyncReentrantReadWriteLock是ReadWriteLock的默认实现类,其内部定义了一个类似于ReentrantLock中的Sync的抽象类,不同的是,ReentrantReadWrite...原创 2019-06-15 23:58:40 · 239 阅读 · 0 评论