自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 收藏
  • 关注

原创 maven依赖机制简介

maven依赖机制官方文档文章目录1,依赖性调解2,依赖关系管理3,依赖范围4,排除依赖项5,可选依赖项可传递的依赖,maven 会自动包含那些你直接依赖的库所需要的依赖库,前提是那些被简介依赖的库是可传递的;基于这个特性,需要有以下这些规定:(解决版本冲突)1,依赖性调解决定了当遇到多个版本作为依赖项时,哪个版本作为依赖项。默认的是 "最接近定义";a->b->c->d1a->e->d2d2离a 比 d1离 a 近,则 d2被作为依赖版本a->b-&

2021-12-23 17:08:16 548

原创 AQS应用-信号量,倒计时锁存器,循环屏障

Semaphore 、CountDownLatch 与 CyclicBarrier 是AQS的另一种应用;我们分别研究三者是如何实现的。SemaphoreSemaphore信号量,可以理解为操作系统中PV原语的java实现;实际上是用AQS的共享变量实现的;如何构造一个Semaphore初始化一个信号量,指定许可的资源数量;默认实现非公平的许可 /** * Creates a {@code Semaphore} with the given number of * pe

2021-12-13 14:57:03 228

原创 AQS的应用-锁

在前三篇文章中,我们已经考察了同步队列与条件队列的创建,入队,出队,取消,与转移过程;这一篇文章,我们来考察AQS的应用;文章目录ReentrantLock如何创建一个重入锁对象如何实现锁定公平锁与非公平锁的区别独占,与重入总结如何释放锁独占模式下,唤醒后继者何时头节点为0独占模式唤醒后继者源码分析总结ReentrantReadWriteLock读写锁简介读写锁类结构公平与非公平同步器读锁与写锁的实现如何构造一个读锁/写锁读写锁如何实现锁定与解锁的背后原理读写锁如何实现重入计数的读锁与写锁阻塞与释放写锁获

2021-12-10 16:01:12 488

原创 AQS条件队列的创建,入队及出队

这时AQS的第三篇文章,在第二篇文章中,我们分析了同步队列的入队与出队,在第三盘文章中,我们去分析条件队列的创建,入队,出队。文章目录ConditionObject 介绍条件队列的创建,入队出队清理取消的节点节点转移到同步队列前的出队等待节点的取消转移总结ConditionObject 介绍条件对象,在MESA模型中,条件对象可以有多个,每个条件对象都有一个对应的条件队列;当调用wait方法时,添加到条件队列;调用notify方法时,从条件队列转移到同步队列;在java中,ConditionObj

2021-12-09 13:33:56 690

原创 AQS 同步队列创建,入队,出队与取消

这是AQS 解读的第二篇,着重介绍同步队列的创建与操作;参见第一篇,同步队列在管程入口处;AQS构建的同步队列是一个双向链表;文章目录AbstractQueuedSynchronizer中的属性同步队列创建与入队入队总结为什么入队,以及入队后发生了什么?acquire资源入队独占模式获取共享模式获取何时park线程条件队列入同步队列transferForSignal 收到信号而转移transferAfterCancelledWait 取消await后转移同步队列出队获取资源的出队操作取消正在获取的节点总结

2021-12-08 18:38:23 666

原创 AQS Node解析

本文作为解析AQS文章的第一篇,着重介绍队列元素的Node的实现。java线程间通信方式java线程间通信方式,有volatile基于可见内存可见性实现的通信,有管道PipedOutputStream,PipedInputStream 基于内存传递实现的通信,有等待通知机制实现的wait,notify,join等方式;实际等待通知机制也是基于共享内存实现的;这里引入一个管程 monitor 的概念,管程是指管理共享变量以及对共享变量的操作的过程。java关键字 synchronized 就是基于MESA

2021-12-08 13:28:10 428

原创 LongAdder理解

LongAdder是对Long类型字段进行多线程累加的工具类,在线程竞争较多后,LongAdder比AutomicLong更有效率;AutomicLong 当调用自增方法时,是使用cas + 自旋的方式 实现的;相对慢的原因是,仅对 valueoddSet 进行操作; public final long incrementAndGet() { return unsafe.getAndAddLong(this, valueOffset, 1L) + 1L; } public

2021-12-02 14:38:30 430

原创 在linux上运行java的Hello,world

centos上执行java代码

2021-12-01 16:21:24 1588

原创 《编码的奥秘》读书笔记

想花三天的时间,把编码奥秘读一遍;写读书笔记的目的,不在于传播,而仅在与记录自己收获到了什么。文章目录全加器不借位减法反馈与触发器振荡器触发器R-S触发器电平触发的D型触发器边沿触发的D型触发器分频器计数器8位行波(异步)计数器具有预置与清零作用的边沿性D型触发器存储器2-1选择器8-1选择器3-8译码器RAMRAM阵列8*2RAM 阵列16 * 1 的阵列1024*8 RAM 阵列构建大型RAM阵列控制面板自动操作100个8位数相加任意几个数相加,并将值存储到存储器中思路一,指令存储器与数据存储器分隔,

2021-11-03 18:16:49 969

原创 隐函数的求导

例题:求方程 e^y + xy - e = 0 所确定的隐函数的导函数 dy/dx解:dy/dx 的含义就是函数 y = f(x) 对于 x 的导数;对方程两边分笔进行 对 x 的求导e^y 对 x 的求导 就是 (e^y)‘y’ = e^y dy/dxxy 对 x 的求导 就是 x’y + y’x ,即 (xy)’ = y+ xdy/dxe^y dy/dx + y + x dy/dx = 0 ;=> dy/dx = -y/(e^y + x ) e^y + x 不等于0记录这篇

2021-10-15 15:08:09 2411 1

原创 Mockito 实战

文章目录1. 无法 spy 或者 mock final 类2. doReturn when 与 when().thenReturn()3. doReturn 仍然产生真实的调用4. doReturn()未生效,但执行对象是打桩的 mock/spy对象5. 嵌套服务的测试总结使用Mockito遇到的问题1. 无法 spy 或者 mock final 类 升级 mockito的版本 <dependency> <groupId>org.mo

2021-08-20 17:31:44 4632

原创 中文与unicode转换

用途:国际化配置时,需要将中文转换成对应的unicode编码;比如1000=memberId不能为空,转换成 1000=memberId\u4e0d\u80fd\u4e3a\u7a7a;代码:import java.io.*;import java.net.URISyntaxException;import java.net.URL;/** * 国际化文件翻译处理 * * @author wael@yunio.com * @date 2021/7/12 */public clas

2021-07-13 14:49:06 2983

原创 AQS 从后往前遍历寻找继任者

在阅读AQS源码的过程中,也许会存在这样的困惑,为什么当next指针对应的节点为null 或者取消时,从tail 向前遍历寻找最近的一个非取消的节点;当前任释放时,需要获取继任者;获取继任者时需要避免与新来的竞争者竞争;AQS的实现方式是从tail 向前遍历,之所以这样是与入队时的逻辑有关;见注释 /** * Inserts node into queue, initializing if necessary. See picture above. * @param node

2020-12-29 15:21:48 939

原创 理解 ThreadLocal 内存溢出

我们知道每一个线程都有一个 名为 threadLocals 的 ThreadLocalMap 对象,而且这个名字的仅有一个;它就是一个 map 对象,我们知道 map 对象是存储键值对的;这个map 的键 就是弱引用化的 ThradLocal 对象,值 就是我们调用 thradlocal.set() 方法存储的值;所以一个线程的生命周期内,可以跨越过很多个方法,可以拥有过 n 多个 threadLocal对象,他们都可以向 线程自己的 threadLocals 这个 map 对象中存储值;以上,只是对

2020-12-22 16:33:49 234

原创 给定一个二维数组,要求输出一个最少元素的一维数组与二维数组中的每一个都有交集,寻找所有的输出的可能性

如题,简单的一个算法;希望对有缘人有帮助import org.springframework.util.CollectionUtils;import java.util.*;import java.util.stream.Collectors;/** * list工具类 * * @Author: * @Description: * @Date: 2020/11/30 */public class ListUtils { /** * * Given

2020-12-03 13:28:44 212

原创 理解java 内部类

一直对内部类有着模糊的认识,今天尝试总结下内部类;内部类的使用:内部类在jdk源码中有很多实现,比如在 SynchronousQueue ,AQS 中,一般一个工具类支持两种表现的特点是会用到内部类,公平与非公平等;在什么场景下,应该使用内部类?我想上面的例子是一个参考。在 thinking in java 中说到,内部类有效实现了 多重继承;class文件命名规律无论是成员内部类还是静态内部类,javac 编译后都是以 OuterClassNameInnerClassName.class命名,

2020-10-26 20:03:31 155

原创 jmm的认识与内存屏障的看法

什么是 jmm?jmm,java内存模型;为了屏蔽不同系统及硬件的差异,java 虚拟机规范定义的线程并发时内存访问模型;jmm从内存分配上,将内存虚拟的分为每个线程独有的工作线程,与共有的主线程;每个线程之间不能访问别的线程中的内存;从内存交互上定义了8种原子的 lock、unlock、read、load、use、assign、store、write 内存交互操作;从内存访问安全特性上说;1、原子性:对于简单的基本类型的赋值操作 比如 int i = 10,是原子操作;而对于 i = j ,则不是

2020-10-12 18:50:37 381 1

原创 LockSupport的 简单理解

在学习 SynchronousQueue 时,看到了 LockSupport 这个工具类;因此写了一个demo 去理解下 unpark 与 park 的所谓的 permitpackage threads.park;import java.util.concurrent.locks.LockSupport;/** * 用于理解 park 与 UnPark * upPark 相当于免停命令,持有一次 unPark 免于下一次 park() 的叫停,但再一次 park(),将会block */

2020-09-28 16:01:44 145

原创 连续自然数缺一个时,找出这个缺少的数

近日,看文章对于这个问题的一种算法:连续的N 个自然数求异或运算得 X,然后对给定的数进行异或运算得 Y,最后将 X 与 Y 进行异或运算得到的值即为缺少的值;思索很久,都觉得无法理解:实际上原理很简单a ^ b ^ a = b;a ^ b ^ c = Xa ^ b = YY ^ c = Xc = Y ^ c ^ Y = X ^ Y想了大概2个小时吧,基于对于异或运算的理解不熟悉,不入加法运算那样理解深刻,所以无法想出这种算法吧...

2020-08-20 12:20:21 369

原创 逆序打印单向链表

1、遍历打印的方式的思路:head 是一个标识,head 持有的引用,为第一个节点 ,设这个节点为 p,并始终保持 p 为 head 持有的节点,当 p 拥有下一个节点 q(q != null)时,获取 并记录 q 的下一个节点 t,将 q 当做 p(即 第一个节点的引用指向 q),并把 q 的下一个节点设为 p (即实现逆序),并 把 t 设置为 q(实现推进);2、递归打印的方式思路:当前节点如果有下一个节点,则对下一个节点操作,知道下一个节点为 null 时返回,并打印当前节点的值;packa

2020-08-17 11:59:39 273

原创 java 多线程处理任务的进度展示

如题,多线程处理一个比较耗时的任务,比如耗时为 100 * 100ms 的大的文本解析任务,可以使用多线程处理,并实时反馈任务进度;代码没有经过生产验证,只是自己想法的实现,关于线程池的知识,可以参考 传送门;package concurrent;import java.util.concurrent.*;/** * 多线程处理大任务的进度百分比 */public class ProcessRate { private static ExecutorService executor

2020-07-24 00:46:38 1738

原创 java wait()与sleep()

sleep()方法,属于 Thread类,表示正在执行的当前线程暂停执行,交出cpu时间,让其他线程去竞争执行;wait()方法,属于Object类,表示的是正在执行的线程交出当前对象(调用 wait()方法的对象)的独占权,让其他线程有机会执行被当前对象锁住的方法;package Threads;/** * wait 方法属于对象的, * wait 方法会释放对象的独占权,而sleep则不会 */public class TestWait { public static void

2020-07-22 15:10:41 115

原创 手写 HashMap

忙里偷闲,写了个 自己的HashMap,没有使用红黑树,仅是数组+单向链表的方式;唯一的收货,大概就是理解了,为何阿里代码开发规范中,要求指定初始化的容量:因为每一次的resize都相当于,都是一个O(N)的操作;/** * 基于数组+链表实现的hashMap * * @param <K> * @param <V> */public class MyHashMap<K, V> { static class Entry<K, V> {

2020-07-21 10:37:19 83

原创 java bst的中序遍历

直接上代码,仅递归实现了BST的插入,递归与循环方式实现了中序遍历;`import java.util.Stack;public class BinarySearchTree {class TreeNode {K value;TreeNode leftChild;TreeNode rightChild;boolean hasPrint = false; public TreeNode(K value, TreeNode<K> leftChild, TreeNode<K&

2020-07-21 10:22:02 344

原创 java char能代表一个汉字吗

java 本身的char,是16位的unicode;原则上一个汉字对应的unicode 值小于 FFFF,就能用汉字表示;理解unicode:unicode,可以理解成一个字典,美国人把当时世界上全部的字,都用对应的 unicode 值表示出来;比如 汉字 ‘中’ 对应的unicode值是 0x4e2d;则 0x4e2d 与 ‘中’ 在 unicode 字典中,是一一对应的关系;获取一个字符的unicodechar c = '中';String cUnicode = Integer.toHexS

2020-05-22 18:47:57 535 1

原创 js 实现个位数的不含括号的 四则运算

// push 尾进 pop 尾出 unshift 头进 shift 头出// stack 头进头出 尾进尾出// queue 头进尾出 尾进头出// 例题 : 设计一位数字 +-*/ 不包含括号的计算器 (parse 计算 规约)// 目前方法仅支持 正常的输入 '3+5*2/4-9/7*5+1',任何非数字开头,连续操作符都会导致异常function calc(sToken...

2020-03-25 23:18:29 165

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除