java
文章平均质量分 74
Java与大数据进阶
这个作者很懒,什么都没留下…
展开
-
idea以任意顺序debug多线程程序
在idea中使用debug可以让多个线程以任意顺序执行,先介绍一下基础知识,然后介绍具体做法。1 debug 两类 Supspend在断点处右键,可以看到Suspend分两类,一类是All,一类是Thread。当某个线程到达断点处会触发Suspend,All会使得所有线程都暂停,Thread只会使当前触发的线程暂停,其他线程不受影响。在idea中使用debug可以让多个线程以任意顺序执行,先介绍一下基础知识,然后介绍具体做法。1 debug 两类 Supspend在断点处右键,可以看到Suspen原创 2021-08-29 18:51:11 · 704 阅读 · 0 评论 -
动力节点—2020最新MyBatis教程笔记
文章目录1 介绍2 快速入门2.1 操作步骤(P9)2.1.1 首先创建maven2.1.2 接着会做一些配置2.2 在编译的target目录下面缺少xml的解决方式(P11)2.3 日志的输出2.4 注意事项2.5对各个对象的分析**Resources** **类****SqlSessionFactoryBuilder** **类****SqlSessionFactory** **接口****SqlSession** **接口**2.6 工具类3 MyBatis DAO代理3.1两种sql的执行方式3.2原创 2021-08-15 20:49:03 · 1154 阅读 · 0 评论 -
ArrayBlockingQueue源码解析(基于JDK8)
文章目录1 介绍2 添加2.1 add2.2 offer2.3 put2.4 enqueue3 删除3.1 remove3.2 poll3.3 take3.4 dequeue4 其他BlockingQueue 称为堵塞队列,可以向队列中添加元素,也可以从队列中取出元素。当队列为空时,取出可以返回失败,抛出异常或者堵塞;当队列满时,添加可以返回失败,抛出异常或者堵塞。堵塞的方法分别是 put/take。生产者和消费者问题可以通过堵塞队列实现,只需要在队列为空或满的时候堵塞就行了。Throws原创 2021-05-23 16:52:48 · 320 阅读 · 0 评论 -
CopyOnWriteArrayList源码解析(基于JDK8)
文章目录1 基本属性和方法2 读3 写3.1 add3.2 remove3.3 set/clear4 迭代器5 copyOnWriteArraySetCopyOnWriteArrayList 是一种写时复制的 ArrayList,在写操作时加锁,拷贝原数组成员,在拷贝的数组上进行修改,并重置数组。该类对于读写可以并发执行,如果写线程还未重置数组,读到的是旧数据;如果已经重置,读到的是新数据。1 基本属性和方法写时使用 ReentrantLock 加锁。内部数组 array 存储数据,用 volati原创 2021-05-15 14:49:58 · 571 阅读 · 6 评论 -
ReentrantReadWriteLock源码解析(基于JDK8)
文章目录1 介绍1.1 ReentrantReadWriteLock1.2 state1.3 HoldCounter2 读锁2.1 读锁的获取2.1.1 tryAcquireShared2.1.2 fullTryAcquireShared2.1.3 readerShouldBlock2.1.4 tryReadLock2.2 读锁的释放3 写锁3.1 写锁的获取3.1.1 tryAcquire3.1.2 writerShouldBlock3.1.3 tryWriteLock3.2 写锁的释放4 锁降级1 介原创 2021-05-04 19:48:38 · 433 阅读 · 3 评论 -
ThreadLocal源码解析(基于JDK8)
文章目录1 ThreadLocalMap1.1 弱引用问题1.2 构造器1.3 set1.3.1 replaceStaleEntry1.3.2 expungeStaleEntry1.3.3 cleanSomeSlots1.3.4 rehash1.3.5 expungeStaleEntries1.3.6 resize1.4 get/remove2 ThreadLocal2.1 childValue2.2 threadLocalHashCode2.3 其他3 ThreadLocal 的简单使用ThreadLo原创 2021-04-24 21:23:49 · 432 阅读 · 0 评论 -
Semaphore源码解析(基于JDK8)
文章目录1 介绍2 tryAcquireShared3 tryReleaseShared4 构造器和其他5 使用5.1 简单使用5.2 尝试可重入5.3 直接释放1 介绍Semaphore 称为信号量,也是一个共享锁。通过一个内部类 Sync 继承 AQS,并重写了 tryAcquireShared和 tryReleaseShared。共享锁具体原理可以见我 AQS 的第二篇。AQS(二)共享锁必须给初始的资源个数 state。每次 acquire 都会减少 state,如果为 0,会堵塞;relea原创 2021-04-18 16:36:43 · 245 阅读 · 0 评论 -
CountDownLatch源码解析(基于JDK8)
文章目录1 介绍2 CountDownLatch 的方法3 总结及使用1 介绍CountDownLatch是一种AQS共享锁,可以看之前的介绍AQS(二)共享锁(基于JDK 8)CountDownLatch 定义了一个计数器,和一个阻塞队列, 当计数器的值递减为0之前,阻塞队列里面的线程处于挂起状态,当计数器递减到0时会唤醒阻塞队列所有线程,这里的计数器是一个标志,可以表示一个任务一个线程,也可以表示一个倒计时器,CountDownLatch可以解决那些一个或者多个线程在执行之前必须依赖于某些必要的前原创 2021-04-11 21:19:45 · 216 阅读 · 0 评论 -
ReentrantLock源码解析(基于JDK8)
文章目录1 介绍2 lock2.1 lock2.2 acquire2.3 tryAcquire3 unlock4 ReentrantLock4.1 构造器4.2 其他5 ReentrantLock 使用1 介绍前置知识,可以看AQS(一)独占锁(基于JDK 8)ReentrantLock 是一个可重入的独占锁。在独占模式中,isHeldExclusively 为 true 表示是对当前线程加锁,false 表示未加锁或者对其他线程加锁。加锁状态由 state 标识,如果为0,则说明未加锁,如果大原创 2021-04-01 21:38:47 · 229 阅读 · 0 评论 -
AQS(三)条件队列(基于JDK 8)
文章目录1 介绍1.1 Node2 await2.1 addConditionWaiter2.2 unlinkCancelledWaiters2.3 fullyRelease2.4 isOnSyncQueue2.5 checkInterruptWhileWaiting2.6 reportInterruptAfterWait3 signal/signalAll3.1 doSignal/doSignalAll3.2 transferForSignal4 总结和使用1 介绍参考: https://segmen原创 2021-03-30 21:32:42 · 542 阅读 · 0 评论 -
AQS(二)共享锁(基于JDK 8)
文章目录1 介绍2 锁的获取 acquireShared2.1 doAcquireShared2.2 setHeadAndPropagate2.3 和独占锁的比较3 锁的释放 releaseShared3.1 doReleaseShared1 介绍上一篇文章,讲了独占锁,AQS(一)独占锁(基于JDK 8),本篇只讲独占锁。某些共享锁使用的方法在独占锁中已经出现了,不再介绍,请读者自行去上面查看。在 Semaphore 中,acquire 调用的是 acquireSharedInterruptibl原创 2021-03-29 21:06:45 · 231 阅读 · 0 评论 -
AQS(一)独占锁(基于JDK 8)
文章目录1 介绍1.1 state1.2 Node1.3 模板方法1.4 其他2 锁的获取 acquire2.1 acquire2.2 addWaiter2.3 enq2.4 acquireQueued2.5 shouldParkAfterFailedAcquire2.6 cancelAcquire3 锁的释放release3.1 unparkSuccessor3.2 从尾遍历的原因(尾分叉)4 其他方法1 介绍在开始之前,先推荐一本书和两个博客,书是《Java并发实现原理:JDK源码剖析_出版社 电子原创 2021-03-28 18:06:15 · 211 阅读 · 0 评论 -
LongAdder 源码解析(基于 JDK 1.8)
文章目录1 LongAdder2 Striped64LongAdder 和 LongAccumulator 基本一致,区别在于前者默认是加法,后者会同时传入一个表达式,具体结果是通过二元表达式计算得到的。DoubleAdder 和 DoubleAccumulator 没有做什么,只是使用 Double.longBitsToDouble和 Double.doubleToRawLongBits进行 Long 和 Double 的转换,剩下的和前面两个类一样。1 LongAdderLongAdder 继原创 2021-03-16 20:15:21 · 152 阅读 · 0 评论 -
AtomicStampedReference源码解析(基于 JDK 1.8)
文章目录1 Stamped 和 Markable的比较2 介绍3 其他方法4 代码示例在 atomic 包中,有三个 Reference 相关的类:AtomicReference,AtomicStampedReference,AtomicMarkableReference。AtomicReference 无法解决 ABA 问题,而后面的两个类特别是 AtomicStampedReference 能够很好地解决 ABA 问题。ABA问题可以见我前面的文章 unsafe 介绍(二)与CAS1 Stamp原创 2021-03-15 22:32:33 · 213 阅读 · 0 评论 -
JDK 源码阅读配置
起初我看的是韩顺平老师的各种配置,现在那个视频已经不存在了,可以看别人截的屏。老师用的是 Oracle JDK 8,我发现很多类看不到,所以导入了 OpenJDK8,记录一下整个配置过程。我安装的是 JDK8,但是导入 OpenJDK 一样没有问题。可以在我的公众号获取相应的OpenJDK:Java与大数据进阶1 Settings 设置首先找到 File—Settings—Build,Execution,Deployment—Debugger—Stepping,如图。将下面的 Do not s原创 2021-03-14 18:28:14 · 154 阅读 · 0 评论 -
AtomicIntegerArray 源码解析(基于 JDK 1.8)
文章目录1 偏移量的计算2 其他3 使用AtomicIntegerArray 可以原子的更新 int[] 中某个对象。在找到数组第0个对象的偏移量之后,由于数组中每个对象是顺序排放的,可以根据对象大小计算出数组中某索引的偏移量,然后通过 Unsafe 相关的方法来获取或者修改。1 偏移量的计算假设数组中第 0 个对象的在数组中的偏移量为 x,每个对象的大小为 y,那么数组中第 i 个元素在数组中的偏移量为 x+i*y。下面是具体实现。base 表示的就是第 0 个对象的偏移量 x,scale 或者原创 2021-03-13 09:17:27 · 158 阅读 · 0 评论 -
AtomicIntegerFieldUpdater 源码解析(基于 JDK 1.8)
文章目录1 介绍2 具体实现类2.1 部分预备知识2.2 初始化2.3 Unsafe 相关3 实际使用3.1 AtomicIntegerFieldUpdater 的使用3.2 Reflection.getCallerClass()1 介绍AtomicIntegerFieldUpdater 是将某个类 T 的某个 int 属性包装一下,使得该属性能够在多线程中保持原子性。具体使用可见第三节。有如下的要求:只能修改对于其可见的字段;目标类的操作字段必须被volatile关键字修饰;目标类原创 2021-03-12 19:10:03 · 248 阅读 · 0 评论 -
AtomicInteger 源码解析(基于 JDK 1.8)
文章目录1 介绍2 初始化和 get/set3 原子操作1 介绍AtomicInteger 是一个原子类,增加和删除是原子性的,避免外界直接使用 Unsafe 来实现原子操作。实现原子性的原理是 CAS,具体可见我前面的文章。 unsafe 介绍(二)与CAS成员变量 value 是 volatile 的,保证可见性。Volatile 介绍public class AtomicInteger extends Number implements java.io.Serializable {原创 2021-03-10 08:53:02 · 227 阅读 · 0 评论 -
unsafe 介绍(二)与CAS
文章目录1 CAS 介绍1.1 定义1.2 ABA 问题2 Unsafe 中的CAS2.1 基本方法2.2 扩展方法2.3 解释在 Oracle JDK 8 中,找不到 unsafe.java,在 idea 中只能由 unsafe.class 反编译得到一个 unsafe.java。解压openjdk-8u41-src-b04-14_jan_2020.zip,查看 .\openjdk\jdk\src\share\classes\sun\misc\unsafe.java。这里我也将 unsafe.jav原创 2021-03-08 22:23:52 · 136 阅读 · 0 评论 -
Unsafe 介绍(一)
文章目录1 初始化2 获取unsafe3 get/put4 堆外内存4.1 分配4.2 赋值4.3 释放4.4 内存大小4.5 使用5 类/对象/数组5.1 对象5.2 类5.3 数组5.4 使用6 线程6.1 介绍6.2 使用7 内存屏障8 CAS9 其他10 unsafe 源码在 Oracle JDK 8 中,找不到 unsafe.java,在 idea 中只能由 unsafe.class 反编译得到一个 unsafe.java。解压openjdk-8u41-src-b04-14_jan_2020.原创 2021-03-05 16:32:50 · 868 阅读 · 0 评论 -
Volatile 介绍
文章目录1 介绍2 Java 内存模型 JMM3 特性3.1 可见性3.2 有序性3.3 不保证原子性本文主要参考 《Java并发编程的艺术》以及一些博客1 介绍如果一个变量用了volatile修饰,那么这个变量是对所有线程共享的、可见的,每次jvm都会读取最新写入的值并使其最新值在所有CPU可见。当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量。当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值刷新到主内存。2原创 2021-03-03 10:38:40 · 394 阅读 · 2 评论 -
LinkedHashMap 源码解析(基于 JDK 1.8)
文章目录1 主要属性2 构造器3 钩子函数的实现3.1 afterNodeAccess3.2 afterNodeRemoval3.3 afterNodeInsertion4 removeEldestEntry5 get6 put 相关6.1 putVal6.2 linkNodeLast7 remove8 迭代器源码环境: JDK 1.8LinkedHashMap 是 HashMap 的子类,在 HashMap 的基础上,对于每一个出现的节点 Node e,用双向链表来连接。可以理解为 LinkedHas原创 2021-02-24 15:50:16 · 288 阅读 · 0 评论 -
HashMap 源码解析(基于 JDK 1.8)
文章目录1 常用变量及节点类2 构造器及 tableSizeFor3 put相关方法3.1 put/putIfAbsent/putAll3.2 putMapEntries3.3 hash3.4 putVal3.5 resize4 get 相关4.1 get/getOrDefault4.2 getNode5 remove 相关5.1 remove5.2 removeNode6 replace7 钩子函数8 键值对集合9 迭代器源码环境: JDK 1.8。本文不介绍红黑树节点的处理过程。在 1.8 中,H原创 2021-02-22 11:13:55 · 152 阅读 · 1 评论 -
LinkedList 源码解析(基于 JDK 1.8)
文章目录1 成员变量和 Node2 构造器3 预备方法3.1 linkFirst3.2 linkBefore3.3 unlink3.4 unlinkFirst3.5 其他4 add 相关4.1 add4.2 addAll4.3 offer5 remove6 get/set7 迭代器7.1 迭代器7.2 反向迭代器源码环境: JDK 1.8。关键的算法用 gif 图进行描述。如果大家对画图或者 gif 工具有建议,欢迎在评论区评论。1 成员变量和 Node链表节点是 Node,Node 包含 ite原创 2021-02-19 15:22:13 · 112 阅读 · 0 评论 -
ArrayList 源码解析(基于 JDK 1.8)
文章目录ArrayList 源码解析1 主要属性2 构造器3 add以及扩容3.1 add3.2 addAll3.3 扩容相关4 remove5 get/set6 迭代器6.1 迭代器6.2 列表迭代器ArrayList 源码解析源码环境: JDK 1.8首先介绍读源码的方法,有些构建的方法会将源码整体编译,造成卡顿,需要加大 Build process heap size。这里不将源码拷贝到src,具体见韩顺平的源码阅读配置视频:韩顺平源码视频,或者别人做的视频截图:自制截屏PPT看源码主要看属性原创 2021-02-17 21:20:42 · 96 阅读 · 0 评论 -
java的Enum反编译
想要写一个enum B,并反编译,找了好久终于找到反编译结果比较全的方法在idea中创建文件如下package A;public enum B { Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday}1.在idea左侧的output或target找到对应的B.class,打开,默认由FernFlower反编译,这个是插件Java Bytecode Decompiler,如果没有反编译,需要下载和勾选,结果如下package原创 2020-12-18 21:29:32 · 511 阅读 · 2 评论 -
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space的解决
一般考虑内存不足。1.在eclipse.ini里面修改以及添加-Xms1024m-Xmx5120m-XX:PermSize=1024M-XX:MaxPermSize=4096M分别代表堆起始内存,堆最大内存,其他起始内存,其他最大内存。2.在具体项目里面也要修改如果只是修改前面,会发现还是不行,需要run->run configurations,选择项目,在vm argume...原创 2020-05-01 22:34:46 · 2658 阅读 · 2 评论 -
JAVA从一个数组中随机取几个不相同的元素
见java核心卷I,程序3.7我们假设从包含n个不相同的元素的数组all中,取k个不同元素放入result。则int result[] = new int[k]; for(int i=0; i<k; i++) { int temp = (int)(Math.random()*n); result[i] = all[temp]; all[temp] = all[...原创 2019-10-12 08:45:16 · 2697 阅读 · 0 评论 -
俄氏乘法
又称俄国农夫法(Russian peasant method),nm=(n/2)(2m)或nm=((n-1)/2)(2m)+m。n为偶用前一个,奇用后一个。到1*m=m时返回。为什么要提这个算法呢,因为乘除2对计算机来说只是移位,这样速度就比较快了。我从来没有想过类似的方法,比较惊奇,所以记下来学习下。时间效率O(log(n))。下面是非递归的代码。package fds;pub...原创 2018-11-26 14:53:19 · 512 阅读 · 0 评论 -
求解强连通分量的一种方法
如果对于任意两个不同的顶点u和v,存在一个从u到v的有向路径以及从v到u的有向路径,这样的有向图被称为是强连通的。一般来说,一个有向图的顶点可以分割成一些互不相交的最大子集,每个子集的顶点之间可以通过有向图中的有向路径相互访问,这些子集被称为强连通分量。下面的方法来自《算法设计与分析基础》作者: Anany Levitin 译者: 潘彦下面三步说的顶点变成死端是递归的dfs出栈的顺序。...原创 2018-11-24 19:27:53 · 305 阅读 · 0 评论 -
海战小游戏
游戏中两个对手,分别是玩家和计算机。两块10*10的方格上放置自己的舰艇。每人5艘舰艇:一艘驱逐舰2格,一艘潜艇3格,一艘巡洋舰3格,一艘战列舰4格,一艘航空母舰5格。舰艇可以竖着放或横着放,任意两艘舰艇不能互相接触。双方轮流轰炸对方的舰艇。如果击中,可以继续攻击,直到击不中为止。游戏的目标是赶在对手之前把他所有的舰艇击沉。要击沉一艘舰艇,该舰艇的所有格子都必须被命中。做这个程序,熟悉...原创 2018-11-23 10:07:57 · 1610 阅读 · 1 评论 -
Fibonacci的几种方法讨论
fd原创 2018-11-20 06:40:10 · 104 阅读 · 0 评论 -
汉诺塔
浮点数原创 2018-11-20 05:56:41 · 166 阅读 · 0 评论 -
深度优先dfs求解两点间所有路径
public static void dfs4(AGraph a,int start,int end, int visited[],int stack[],int top) { visited[start]=1; stack[++top]=start; if(start==end) { System.out.println(&quot;成功&quot;); for(int i=0;i...原创 2018-11-23 19:17:04 · 3506 阅读 · 0 评论 -
关于深度优先顶点顺序的感想
众所周知,DFS可以用递归实现,也可以用栈来实现。某算法书上用递归实现,说顶点顺序的种类有两种,我又用栈实现,顶点的顺序又多了两种。不同的顶点顺序可以适应不同场合。BFS只有一种顺序。要注意的是,如果要记录双亲结点,visited[]i可以存储i双亲结点,未被访问的设为-1,被访问的根节点设为-2。这样可以保证存储的元素是0时一定是指的双亲结点是0,没有歧义。如果不记录双亲结点,visited...原创 2018-11-23 18:42:11 · 266 阅读 · 0 评论 -
扩展欧几里得算法
https://www.cnblogs.com/hadilo/p/5914302.html引理:存在 x , y 使得 gcd(a,b)=ax+by目的是求最终的x,y。不停的向前迭代即可。由于java不能取地址,一次返回两个值可以用List,当然也可以写成全局变量。可以见https://www.cnblogs.com/zj0208/p/6207077.htmlpublic static...原创 2018-11-15 06:41:39 · 125 阅读 · 0 评论 -
折半查找和差值查找
都用于有序数组,下面假设单增折半查找思想简单,直接写了public static int BinarySearch(int a[],int k) { int l=0; int r=a.length-1; while(l<=r) { int m=(l+r)/2; if(a[m]==k) return m; else if(k<a[m]) r...原创 2018-11-26 15:13:45 · 128 阅读 · 0 评论 -
二叉查找树及Avl树
定义不再叙述,看程序应该是这本书,我看的第二版https://book.douban.com/subject/10530466/下面是二叉查找树,我认为比较好的一点是在插入的时候返回修改的子树,代替了c里面的指针,这是我看c数据结构想改写为java时所没有想到的。还有一点,用户在插入时是不知道root的,而插入函数需要root,所以要有两个插入函数,一个是外部的,只传入值;一个是内部的,传...翻译 2018-11-26 15:42:12 · 184 阅读 · 0 评论 -
Comparator和Comparable的使用
根据 中国大学MOOC java核心技术 陈良育 第十章第六节整理https://www.icourse163.org/course/ECNU-1002842004?tid=1206091267•对象实现 Comparable 接口(需要修改对象类)– 实现compareTo 方法• > 返回1,== 返回0 ,< 返回-1– Arrays 和 Col...转载 2019-04-24 20:36:00 · 152 阅读 · 0 评论 -
粘代码出现的错误解决
今天粘java代码到eclipse出现错误Syntax error on tokens, AnnotationName expected instead可以粘到notepad++里面,会发现多了很多非法字符,都用空格替换掉就好了。原创 2019-04-18 13:36:30 · 481 阅读 · 0 评论