
JAVA
张伯毅
某厂技术,Apache DolphinScheduler Committer.
专注于调度&实时&大数据体系~
展开
-
JAVA 如何使用java指令解压jar包.
java 解压~原创 2022-06-23 23:45:00 · 3340 阅读 · 0 评论 -
Java synchronized锁 String 和 Integer 会有什么问题?
java synchronized 锁String , Integer 对象...原创 2022-06-21 23:45:00 · 1188 阅读 · 1 评论 -
并发编程——原子性,可见性和有序性
1、原子性即一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。原子性就像数据库里面的事务一样,他们是一个团队,同生共死。2、可见性可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。3、有序性即程序执行的顺序按照代码的先后顺序执行。...原创 2021-07-04 15:53:50 · 239 阅读 · 0 评论 -
Java中布尔类型操作符[ ` &= ` , ` |= ` , 与 ` ^= ` ]
一. 结论今天刷Flink代码的时候, 发现操作符 |= , 这个是什么鬼, 做了这么多年Java瞬间觉得好丢人…总结:跟正常的 && , || 操作差不多,输出的结果都是boolean类型.a操作符b结果true&=truetruetrue&=falsefalsefalse&=truefalsefalse&=falsefalsetrue|=truetrue原创 2021-05-17 23:46:26 · 2111 阅读 · 0 评论 -
阿里Java开发手册[泰山版] 关键速记 ?
刚刚过了一下阿里Java开发手册,发现很多内容都满重要.这里挑了比较重要,或者容易踩的坑进行了记录.看到条数不要害怕,其实很多都是常识,为了加深一下印象而已.Table of Contents1.POJO 类中布尔类型变量都不要加 is 前缀,否则部分框架解析会引起序列化错误。2.Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。3.所有整型包装类对象之间值的比较,全部使用 equals 方法比较。4.浮点数之间...翻译 2020-05-16 02:25:47 · 3572 阅读 · 0 评论 -
基准测试神器 - JMH [ Java Microbenchmark Harness ]
一. 简介JMH,全称 Java Microbenchmark Harness (微基准测试框架),是专门用于Java代码微基准测试的一套测试工具API,是由 OpenJDK/Oracle官方发布的工具。其精度可以达到毫秒级.可以执行一个函数需要多少时间,或者一个算法有多种不同实现等情况下,选择一个性能最好的那个.Java的基准测试需要注意的几个点:测试前需要预热...原创 2020-05-06 15:24:42 · 3814 阅读 · 3 评论 -
IntelliJ IDEA 无法debug JDK 源码解决
如图, 去掉 勾选 java.* 和 javax.*原创 2020-05-01 12:54:58 · 5263 阅读 · 2 评论 -
JAVA工具类 [ 调用HTTP 请求 ]
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information rega...原创 2020-04-27 10:47:53 · 1834 阅读 · 1 评论 -
Java动态代理Proxy&InvocationHandler 实例
代理类在程序运行时创建的代理方式被成为 动态代理。 也就是说,这种情况下,代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。相比于静态代理, 动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类的函数.话不多说,直接撸代码.1.定义代理的接口类.public interface People { ...原创 2020-04-22 10:19:35 · 1549 阅读 · 0 评论 -
JAVA 泛型种类
泛型标记和泛型限定:E、T、K、V、N、?在使用泛型的时候,若希望将类的继承关系加入泛型应用中,就需要对泛型做限定, 具体的泛型限定有对泛型上线的限定和对泛型下线的限定。1.对泛型上限的限定:<? extends T> 在Java中使用通配符“?”和“extends”关键字指定泛型的上限,具体用法为<? extendsT>,...原创 2020-03-11 16:27:11 · 1035 阅读 · 0 评论 -
JAVA 反射 API 入门
概念反射机制指在程序运行过程中,对任意一个类都能获取其所有属性和方法,并且对任 意一个对象都能调用其任意一个方法。这种动态获取类和对象的信息,以及动态调用对象 的方法的功能被称为Java语言的反射机制。Java的反射API◎ Constructor类:表示类的构造方法。◎ Class类:用于获取类的属性、方法等信息。◎ Field类:表示类的成员变量,用于获取和设置类中的属...原创 2020-03-11 15:39:06 · 400 阅读 · 0 评论 -
try catch finally执行顺序测试
结论:常量类型 finally 中没有 renturn 不会影响返回值. finally 中有 renturn 会影响返回值.可见引用类型时finally有没有return都会对当前方法的返回值产生影响.================================================1.finally 中没有returnpublic...原创 2020-03-11 15:09:20 · 422 阅读 · 0 评论 -
Java异常分类及处理
概述在Java中,Throwable是所有错误或异常的父类,Throwable又可分为Error和 Exception,Error有AWTError、ThreadDeathException又可分为RuntimeException 和CheckedException。ErrorError指Java程序运行错误,如果程序在启动时出现Error,则启动失败;如果程...原创 2020-03-11 14:46:43 · 598 阅读 · 0 评论 -
JVM 调优命令&工具使用
top命令查看进程占用资源情况jps 命令 查看 java进程jstack 命令 关注WATTING 查看死锁问题jstat -gc pid 查看 GC 情况jinfo pid 查看 jvm 常用信息arthas [推荐]安装&启动使用 jmap 命令 [生产环境慎用! 会造成生产环境卡顿!!!!]使用jvisualvm 进行查看 d...原创 2020-02-10 15:07:08 · 7468 阅读 · 3 评论 -
JAVA 项目启动 JVM 生产环境 CMS 参数设置参考
参数设置如下:nohup $JAVA_HOME/bin/java $exec_command > $log 2>&1 < /dev/null &-server -Xmx16g -Xms4g -Xss512k -XX:+DisableExplicitGC // 禁止代码中手动调用GC,会导致 full...原创 2020-02-10 10:06:46 · 2968 阅读 · 2 评论 -
JAVA 压缩/解压文件夹 [ tar.gz ]
要用java 压缩多级文件夹&文件. 整理出一个可用的工具类,有问题,请及时联系.压缩文件夹:CompressUtil.compress解压 tar.gz 文件:CompressUtil.decompressmaven 依赖:<dependency> <groupId>org.apache.c...原创 2019-11-27 17:51:27 · 3678 阅读 · 0 评论 -
Java 多线程并发线程基础
进程&线程线程是进程中的一个实体,线程 本身是不会独立存在的 。进程是代码在数据集合上的 一 次运行活动 , 是系统进行资源分配 和调度的基本单位, 线程则是进程的一个执行路径, 一个进程中至少有一个线程,进程中 的多个线程共享进程的资源。操作系统在分配资源时是把资源分配给进程的, 但是 CPU 资源比较特殊, 它是被分 配到线程的 , 因为真正要占用 CPU 运行的是线程 ,...原创 2019-06-25 16:37:40 · 1094 阅读 · 0 评论 -
ArrayBlockingQueue 概览
底层使用数组实现.常量代码: /** The queued items */ final Object[] items; /** items index for next take, poll, peek or remove */ int takeIndex; /** items index for next put, offer, or add */...原创 2019-07-12 21:09:28 · 963 阅读 · 0 评论 -
LinkedBlockingQueue 和 LinkedBlockingDeque 概览
LinkedBlockingQueue和LinkedBlockingDeque,两个都是队列,只不过前者只能一端出一端入,后者则可以两端同时出入,并且都是结构改变线程安全的队列。其实两个队列从实现思想上比较容易理解,有以下特点:链表结构(动态数组)通过ReentrantLock实现锁利用Condition实现队列的阻塞等待,唤醒LinkedBlockingQueueLin...原创 2019-07-12 20:52:20 · 9134 阅读 · 4 评论 -
ConcurrentLinkedQueue 概览
ConcurrentLinkedQueue 是线程安全的无界非 阻塞队列,其底层数据结 构使用单向链表实现,对于入队和出队操作使用 CAS 来实现线程安全 。ConcurrentLinkedQueue 内部的队列 使用单 向链表方式实现,其中有两个 volatile 类型 的 Node 节点分别用来存放队列的首、尾节点 。从下面的无参构造函数可知,默认头、尾 节点都是指向 ite...原创 2019-07-12 20:34:36 · 972 阅读 · 0 评论 -
JAVA : ReentrantReadWritelock
ReentrantReadWriteLock采用读写分 离的策略,允许多个线程可以同时获取读锁 。架构图读写锁的内部维护了 一个 ReadLock 和一个 WriteLock,它们依赖 Sync 实现具体功能 。 而Sync继承自AQS,并且也提供了公平和非公平的实现。 下面只介绍非公平的读写锁实 现。我们知道 AQS 中只维护了 一 个 state 状态,而 Ree...原创 2019-06-27 18:09:18 · 1148 阅读 · 0 评论 -
JAVA 队列: SynchronousQueue
SynchronousQueue 是一个不存储元素的阻塞队列。每一个 put 操作必须等待一个 take 操作,否则不能继续添加元素。SynchronousQueue 可以看成是一个传球手,负责把生产者线程处理的数据直接传递给消费者线程。队列本身并不存储任何元素,非常适合于传递性场景,比如在一个线程中使用的数据,传递给另外一个线程使用,SynchronousQueue 的吞吐量高于 Linke...原创 2019-06-24 17:54:20 · 1654 阅读 · 0 评论 -
Java 注解
4 种标准元注解元注解的作用是负责注解其他注解。 Java5.0 定义了 4 个标准的 meta-annotation 类型,它们被用来提供对其它 annotation 类型作说明。@Target 修饰的对象范围@Target 说明了 Annotation 所修饰的对象范围: Annotation 可被用于 packages、types(类、接口、枚举、Annot...原创 2019-06-21 16:25:56 · 968 阅读 · 0 评论 -
Thread.sleep、Object.wait、LockSupport.park 区别图解
Thread.sleep、Object.wait、LockSupport.park 区别如下图:参考:Java 并发编程之美https://blog.csdn.net/u013332124/article/details/84647915原创 2019-06-26 17:53:22 · 3762 阅读 · 0 评论 -
JAVA 可重入锁: ReentrantLock
概念ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性, synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平锁和非公平锁两种方式。那么,要想完完全...原创 2019-06-26 17:17:10 · 1055 阅读 · 0 评论 -
Java CopyOnWriteArrayList 概述
CopyOnWriteArrayList是一个线程 安全的 ArrayList,对其进行的修改操作都是在底层的一个复制的数组(快照)上进行的 ,也就是使用了写时复制策略。 在 CopyOnWriteArrayList 的类图中,每个 CopyOnWriteArrayList 对象里面有一个 array 数组对象用来存放具体元素, ReentrantLock 独占锁对 ...原创 2019-06-26 14:17:30 · 2349 阅读 · 1 评论 -
JDK 8 原子操作类 LongAdder
AtomicLong 通过 CAS 提供了非阻塞的原子性操作,相 比使用阻塞算法的 同步器来说它的性能己经很好了,但是 JDK 开发组并不满足于此 。 使用 AtomicLong 时, 在高并发下大量线程会同时去竞争更新 同→个原子变量,但是由于同时只有一个线程的 CAS 操作会成功,这就造成了大 量 线程竞争失败后,会通过无限循环不断进行自旋尝试CAS 的操作, 而这会白白浪费 CPU 资源。...原创 2019-06-26 11:21:21 · 1864 阅读 · 0 评论 -
JDK1.8 HashMap和TreeMap区别,读懂这一篇就够了
刚刚被问到HashMap和TreeMap 有什么区别,想了想,就整理一下吧.1.数据结构HashMap: 数组+列表+红黑树TreeMap: 红黑树2. 因为数据结构,导致节点的实体类不一样HashMap: 两种 Node 和 TreeNode (支持链表)static class Node<K,V> implements Map.E...原创 2019-06-18 11:45:24 · 11998 阅读 · 3 评论 -
在linux系统中查看 缓存行 [ cacheline ] 的大小
linux系统中缓存行 [ cacheline ] 默认值: 64byte为了解决计算机系统中主内存与 CPU 之间运行速度差问题,会在 CPU 与主内存之间 添加一级或者多级高速缓冲存储器( Cache)。这个 Cache 一般是被集成到 CPU 内部的, 所以也叫 CPU Cache,如图所示是两级 Cache 结构。在 Cache 内部是按行存储的,其中每一行...原创 2019-06-25 16:53:07 · 13321 阅读 · 0 评论 -
PriorityBlockingQueue 概览
PriorityBlockingQueue 是带 优 先级的无界 阻塞队列,每次出队都返回优先级最高或者 最低的元素。其内部是使用平衡二叉树堆实现的,所以直接遍历队列元素不保证有序。默 认使用对象的 compareTo 方法提供比较规则,如果你需要自定义比较规则则可以自定义 comparators 。PriorityBlockingQueue 内 部有一个数组 queue,用来存放队列元素, ...原创 2019-07-13 11:06:47 · 1178 阅读 · 0 评论 -
DelayQueue 概览
DelayQueue 内部使用 PriorityQueue 存放数据,使用 ReentrantLock 实现 线程同步 。另 外,队列里面的元素要实现 Delayed 接口,由于每个元素都有一个过期时间 , 所以要实现获知当前元素还剩下多少时 间就过期了的接口,由于内部使用优先级队列来实 现,所以要实现元素之间相互比较的接口。类图其中 leader变量的使用基于 Leade...原创 2019-07-13 11:23:15 · 1023 阅读 · 0 评论 -
面试题: 单例模式 Double-Check中的volatile作用
在单例模式中Double-Check 属于比较经典的类型,代码如下.public class Singleton { private Singleton() { } private static volatile Singleton singleton; public static Singleton getInstance() {...原创 2019-08-19 13:36:32 · 1266 阅读 · 0 评论 -
JAVA NIO 源码 : Buffer
Buffer.java类是抽象类, 并不能直接实例. 是一个用于特定基本数据类型的容器。这里的特定基本数据类型指的是:除boolean类型的其他基本上数据类型。缓冲区是特定基本数据类型元素的线性有限序列在Buffer中有两种模式,一种是写模式,一种是读模式。类图:常量 //TODO (标记) 临时备忘位置变量 , 调用 reset 方法的时候用到....原创 2019-07-19 11:39:27 · 386 阅读 · 0 评论 -
JDK12 jdk.internal 包 不可见
IDEA在Message中抛出如下问题:java: 程序包 jdk.internal.misc.Unsafe 不可见(程序包 jdk.internal.misc.Unsafe已在模块 java.base 中声明,但该模块未将它导出到未命名模块)可能出现以上问题的程序包:sun.net、sun.net.util、sun.net.www、jdk.internal.misc、jdk....原创 2019-07-19 09:48:42 · 19217 阅读 · 3 评论 -
抽象同步队列 AQS 三部曲 [ 三 ]
概述AQS 有个内 部类 ConditionObject, 用来结合锁实现线程同步 。 ConditionObject 可以 直接访问 AQS对象内部的变量,比如 state状态值和 AQS 队列。 ConditionObject是条件 变量 , 每 个条件 变量对应 一 个 条 件队列 (单向链表队列),其用来存放调用条件变 量 的 await 方法后被阻塞的线程,如类图所示 , 这个...原创 2019-07-12 16:35:21 · 1087 阅读 · 0 评论 -
抽象同步队列 AQS三部曲 [ 二 ]
图解加锁/解锁 流程图(点击, 放大看)流程概述-------------------------------获取资源-------------------------------当一个线程调用 acquire(int arg)方法获取独占资源时,会首先使用 tryAcquire方 法尝试获取资源, 具体是设置状态变量 state 的值,成功则直接返...原创 2019-07-12 10:41:02 · 1089 阅读 · 0 评论 -
抽象同步队列 AQS三部曲 [ 一 ]
AbstractQueuedSynchronizer 抽象同步队列简称 AQS,它是实现同步器的 基 础组件, 并发包中锁的底层就是使用 AQS 实现的 。AQS是一个FIFO的双向队列,其内部通过节点head和tail记录队 首和队尾元素,队列元素的类型为 Node。其中 Node 中的 thread变量用来存放进入 AQS 队列里面的线程: Node 节点内部的 SHAR...原创 2019-07-12 10:27:52 · 1194 阅读 · 0 评论 -
ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor 是一个 可以 在指定一定延迟时间 后或者定时进行 任务调度执行的线程池。...原创 2019-07-14 22:14:56 · 900 阅读 · 0 评论 -
FutureTask 概览
概念FutureTask一个可取消的异步计算,FutureTask 实现了Future的基本方法,提空 start cancel 操作,可以查询计算是否已经完成,并且可以获取计算的结果。结果只可以在计算完成之后获取,get方法会阻塞当计算没有完成的时候,一旦计算已经完成,那么计算就不能再次启动或是取消。一个FutureTask 可以用来包装一个 Callable 或是一个runnable对...原创 2019-07-14 10:08:33 · 523 阅读 · 0 评论 -
ThreadPoolExecutor 概述 [ 二 ]
ThreadPoolExecutor 的实现 实际是一个生产 消费模型, 当用户添加任务到线程池时相当于生产 者生产元素, workers 线程工作集中的线程直接执行任务或者 从任务队列里面获取任务时则相当于消费者消费元素。程池巧妙地使用 一个 Integer类型的原子变量来记录线程池状态和线程池中 的钱程 个数。通过线程池状态来控制任务的执行,每个 Worker线程可以处理多个任务。线程池 ...原创 2019-07-13 17:57:18 · 959 阅读 · 0 评论