
Java
文章平均质量分 71
码农的进阶之路
三人行,必有我师。学海无涯
展开
-
Java 平铺列表转为树形结构
在业务中往往有一些数据是有层级结构的,比如数据表中原始数据如下形式idnameparentId11null21-1131-1-1241-11想要将平铺的数据变成有层次的树形结构,这里分享一个非递归列表转为树形结构的思路方法。基本的数据结构@Datapublic class Result implements Serializable { private List<Result> children; //父id原创 2022-02-09 10:40:25 · 2507 阅读 · 0 评论 -
volatile关键字详解
前言我们知道,操作系统主要由CPU、I/O设备,主存等组成。但是由于CPU的处理速度与内存的读取速度相差好几个量级,而且CPU是非常宝贵的资源。因此在内存与CPU之间引入了高速缓存,内存将待处理的数据放入高速缓存,cpu从高速缓存读取数据,借以充分利用CPU的资源。CPU的高速缓存分为L1 cache/L2 cache/L3 cache。它们的存储大小L1<L2<L3,其读取速度...原创 2020-03-15 21:10:57 · 226 阅读 · 0 评论 -
CAS的ABA问题及解决方案
ABA问题比如有两个线程,线程T1和线程T2。线程T1的执行时间短(假如需要2s),线程T2的执行时间长(假如需要4s),也即是线程T2执行一次的时间,线程T1可以执行多次。当线程T1将变量从A变成B,又从B变成A,这对线程T2而言,它是不知道该变量是否发生过变化的。可能会导致不可预知的问题。通过原子类举例public static void main(String[] args) {...原创 2020-03-15 21:13:02 · 327 阅读 · 0 评论 -
Java线程组
前面已经提过了关于线程池的一些常用方法。现在着重说一下ThreadGroup 线程组表示一个线程的集合,此外线程组也可以包含其他线程组。线程组构成一棵树,在树中 除了初始线程组外,每个线程组都有一个父线程组。 线程组的构造方法: ThreadGroup(String name) ThreadGroup(ThreadGroup parent,String name)常用的方法如下:原创 2017-11-02 14:34:02 · 257 阅读 · 0 评论 -
CyclicBarrier类浅析
CyclicBarrierCyclicBarrier也可以向CountDownLatch`一样,协调多个线程的执行。只是略有不同的是,CountDownLatch是减至0,而CyclicBarrier是加至某个数字。举例:就好比 只有集齐了7颗龙珠才能召唤神龙常用API方法如下CyclicBarrier(int parties) 创建一个新的 CyclicBarrier,...原创 2020-03-15 21:19:22 · 221 阅读 · 0 评论 -
JDK8 线程池核心代码解析
文章目录线程池中的一些重要属性常见方法解析runStateOfworkerCountOfcltOf线程池状态比较ThreadPoolExecutor构造函数线程池工作单元Worker类解析常用属性常用方法解析executeaddWorkerrunWorker()processWorkerExitgetTaskshutdowninterruptIdleWorkerstryTerminateshutdownNowawaitTermination线程池中的一些重要属性//32-3=29private sta原创 2022-01-24 17:22:06 · 555 阅读 · 0 评论 -
JDK8 ConcurrentHashMap源码解析
文章目录常见属性释义常用小方法解析spread方法tableSizeFortabAt、casTabAt、setAtConcurrentHashMap(int initialCapacity)构造方法initTableForwardingNode构造函数put操作helpTransferaddCount()get操作常见属性释义 //散列表数据最大容量 private static final int MAXIMUM_CAPACITY = 1 << 30; //散列表容量原创 2022-01-24 17:08:37 · 724 阅读 · 0 评论 -
Java锁的分类
公平锁、非公平锁所谓公平锁,就是多个线程按照申请锁的顺序来获取锁,类似排队,先到先得。而非公平锁,则是多个线程抢夺锁,会导致优先级反转或饥饿现象。区别:公平锁在获取锁时先查看此锁维护的等待队列,为空或者当前线程是等待队列的队首,则直接占有锁,否则插入到等待队列,FIFO原则。非公平锁比较则不然,上来直接先尝试占有锁,失败则采用公平锁方式。非公平锁的优点是吞吐量比公平锁更大。其中synchro...原创 2020-03-15 21:15:21 · 171 阅读 · 0 评论 -
AtomicReference类浅析
AtomicReference类JUC中封装了对基本类型的原子操作类,那么如果我们想要保正一个对象的原子性行为呢?这里AtomicReference就派上了用场。使用起来与原子类基本一样。public class AtomicReferenceDemo { public static void main(String[] args) { User user1 = n...原创 2020-03-15 21:13:57 · 1328 阅读 · 0 评论 -
Java并发之线程池的学习
相较线程,线程池的好处: 1、减少在创建和销毁线程上所花的时间以及系统资源的开销 2、可以重复利用线程池中已创建的线程 直接介绍常见的几种线程池: 1、newFixedThreadPool(int nThreads) 创建一个固定数量线程集合的线程池。新的线程加入后,如果正在运行的线程达到了上限,则会阻塞,直到有了空闲的线程来运行。 2、newScheduledThreadPoo原创 2017-11-01 23:33:53 · 189 阅读 · 0 评论 -
Java并发之Callable、Future
提到Callable,不得不说Runnable,首先它们均可以处理多线程工作,但是却有着截然不同的功能特性。Runnable处理异步操作时,无法获得异步多线程操作返回的结果,而Callable可以。不仅如此,在JDK1.5中给出了Future接口,可以拿到Callable计算的结果。 下面给出明确的Callable、Future体系关系图: 本来以为Threhttp://wrad/Runnable与Call原创 2017-11-02 13:18:02 · 233 阅读 · 0 评论 -
Semaphore类浅析
SemaphoreSemaphore,信号量。有时被称为信号灯,是在多线程环境下使用的一种设施,可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量,一旦该关键代码段完成了,那么该线程必须释放信号量,其他想进入该关键代码段的线程必须等待直到第一个线程释放信号量。举例说明:某广场有3个停车位,过来了6辆车,因此会有3辆车暂时没有车位,但是只要车位被空出...原创 2020-03-15 21:20:01 · 321 阅读 · 0 评论 -
如何优雅地停止一个线程
通常情况下,我们不会手动停止一个线程,而是让线程运行结束自然停止。但是在异常情况下依然需要我们提前停止线程,如程序出错重启等。为什么不强制停止线程?对于Java而言,最正确的停止线程的方式是使用interrupt。但是interrupt仅仅起到通知被停止线程的作用。而被停止线程可以选择什么时候停止或者不停止。那么,为什么不强制停止线程呢?因为如果不了解对方正在做的工作而贸然强制停止线程可能会引发一些数据安全问题,为了避免造成问题就需要给对方一定的时间来整理收尾工作。如线程正在写入一个文件,这时收到终原创 2020-06-28 22:13:23 · 345 阅读 · 0 评论 -
JDK8 ThreadLocal源码分析
文章目录ThreadLcoal内部结构变化ThreadLocalMap属性介绍ThreadLocal#setThread#GETThreadLocal#remove关于ThreadLocal的基本使用与介绍,请参见这篇文章ThreadLcoal内部结构变化早期版本的ThreadLocal可以理解为一个Map。当工作线程Thread实例向本地变量保持某个值时,会议"key-value"形式保存在ThreadLocal内部的Map中,其中Key为线程Thread实例,Value为待保存的值。当工作线程Th原创 2022-01-24 17:19:18 · 384 阅读 · 0 评论 -
Java线程中常用的方法
yield当线程调用yield方法后,线程即从运行状态变为可运行状态,将CPU的执行权让给同级别的线程;让出CPU执行权之后,又同别的线程共同争夺CPU的执行权。(可能释放了CPU执行权之后 又抢到了;同时多线程之前是抢占CPU的,所以从运行结果上很难看出是否yield方法起了作用)public class YieldDemo extends Thread { @Overrid...原创 2018-03-05 19:36:56 · 313 阅读 · 0 评论 -
还不理解ThreadLocal的看过来
ThreadLocal是什么?ThreadLocal是Java类库提供的在多线程环境下保证对共享资源安全访问的类ThreadLocal与Thread、ThreadLocalMap是什么关系?通过对源码分析发现,ThreadLocalMap是每一个线程Thread类的成员变量,里面有一个键值对数据Entry[] table,可以认为是一个map。一个Thread对象持有一个ThreadLocalMap成员变量,而ThreadLocalMap依托Entry静态类来存储数据,Entry结构中key表原创 2020-07-04 14:39:02 · 286 阅读 · 2 评论 -
CountDownLatch类浅析
CountDownLatch内部维护了一个计数器,只有当计数器==0时,某些线程才会停止阻塞,开始执行。就好比火箭发射,只有当读秒从10->1之后才执行发射动作一样。构造方法摘要CountDownLatch(int count) 构造一个用给定计数初始化的 CountDownLatch。常用方法await() 使当前线程...原创 2020-03-15 21:18:35 · 218 阅读 · 0 评论 -
CAS及其原理分析
CAS 即 Compare and swap。比较并交换,是一种很重要的同步思想。如果主内存的值跟期望值一样,那么就进行修改,否则一直重试,直到一致为止。上一节当中的原子性问题,就可以基于CAS思想进行解决。如下public class CasDemo { private AtomicInteger num=new AtomicInteger(); public stati...原创 2020-03-15 21:12:28 · 277 阅读 · 0 评论 -
Java集合框架浅析
转载自:http://blog.youkuaiyun.com/ns_code/article/details/35564663 Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组、链表、栈、队列、集合、哈希表等。学习Java集合框架下大致可以分为如下...转载 2018-03-07 10:11:49 · 198 阅读 · 0 评论 -
byte数组、Blob、inputStream、outputStream、MultipartFile之间的转换
byte数组=>inputStreambyte[] b=new byte[1024];ByteArrayInputStream inputStream=new ByteArrayInputStream(b);inputstream=>byte数组public static final byte[] input2byte(InputStream inStream) ...原创 2019-11-20 15:25:41 · 13460 阅读 · 0 评论 -
记一次InputStream重复读取的问题
背景:在做微信支付时,需要将证书放到数据库中再读入系统,因而需要将wxpay这个类库下的部分内容进行了重写,原代码如下: KeyStore keyStore = KeyStore.getInstance("PKCS12"); FileInputStream instream = new FileInputStream(new File(configure.getCertLocalPath()...原创 2019-11-18 22:32:00 · 1136 阅读 · 0 评论 -
lambda常见使用
Lambda基本语法流只能遍历一次我们可以把流想象成一条流水线,流水线的源头是我们的数据源(一个集合),数据源中的元素依次被输送到流水线上,我们可以在流水线上对元素进行各种操作。一旦元素走到了流水线的另一头,那么这些元素就被“消费掉了”,我们无法再对这个流进行操作。当然,我们可以从数据源那里再获得一个新的流重新遍历一遍。stream是采用内部迭代方式若要对集合进行处理,则需...原创 2019-11-06 16:38:26 · 921 阅读 · 0 评论 -
Java内省的学习
内省内省是与反射类似的技术,它是以规范化的Java bean为模板,将类中的成员变量和getter、setter方法关联起来 它的一般用法是: 使用Java反射解析Java类的结构,把字段和该字段对应的setter、getter方法关联起来,封装到PropertyDescriptor(属性描述器)中。通过属性描述器可以直接获得该字段的setter、getter方法的Method对象,进而根据实际原创 2017-10-18 21:04:04 · 345 阅读 · 0 评论 -
Java反射的学习
反射反射 java的反射机制大致是这样的:通过某个类的class文件得到整个类的完整结构信息 我们说,万事万物都是对象,因此对于一个类来说,我们也可以将类中的一些属性看成是对象。整个类可以看成是Class对象,构造函数可以看做是Construtor对象,字段可以看成是Field对象,一般方法可以看成是Method方法。 其实反射机制,通俗的说就是我们可以通过class将原创 2017-10-18 17:19:34 · 477 阅读 · 0 评论 -
Java中的引用传递和值传递
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑。关于值传递和引用传递其实需要分情况看待,今天学习和分析一下,着急可以先看最后的结论。1.基本类型和引用类型在内存中的保存Java中数据类型分为两大类,基本类型和对象类型。相应的,变量也有两种类型:基本类型和引用类型。基...转载 2018-05-10 13:42:44 · 153 阅读 · 0 评论 -
Java内部类详解
转载自http://www.cnblogs.com/dolphin0520/p/3811445.htmlJava内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉。原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法。今天我们就来一探究竟。下面是本文的目录大纲: 一.内部类基础 ...转载 2018-03-19 20:02:47 · 3140 阅读 · 1 评论 -
Java序列化
转载至博客http://blog.youkuaiyun.com/lisulong1/article/details/52269262 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizabl...转载 2018-03-16 14:57:25 · 140 阅读 · 0 评论 -
InputStream.available()获取流大小问题
近日在学习IOUtils时,模拟从网络上读取数据存放到本地磁盘,想使用InputStream.available()查看流的大小,结果发现得到的大小跟实际生成文件的大小不一致。 上代码:InputStream in = new URL("http://www.apache.org").openStream(); System.out.println(in.available()); FileOu原创 2017-11-16 12:57:38 · 33190 阅读 · 2 评论 -
Java字符串常量池
该篇文章转载至Java字符串池(String Pool)深度解析 在工作中,String类是我们使用频率非常高的一种对象类型。JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间,这就是我们今天要讨论的核心,即字符串池(String Pool)。字符串池由String类私有的维护。我们知道,在Java中有两种创建字符串对象的方式:1)采用字面值的方式赋值 2)采用转载 2017-11-15 21:40:26 · 598 阅读 · 0 评论