
java学习
SiriusQiu
纸质阅读成瘾
展开
-
自定义maven插件
maven插件开发maven插件熟练掌握的话毫无疑问会给开发带来许多便捷,这边初步整理了一下maven插件的开发方法一个简单的maven插件1. 配置project descriptor首先一个maven插件,首先需要一个maven工程,然后配置一下项目描述:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"原创 2020-10-26 15:31:28 · 151 阅读 · 0 评论 -
java监控命令
文章目录JVM学习04——java监控命令jpsjstat:虚拟机统计信息监视工具jinfo:Java配置信息工具jmap:Java内存映像工具jhat:虚拟机转储快照分析工具jstack:Java堆栈跟踪工具JVM学习04——java监控命令jpsjps可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class)、名称以及这些进程的本地虚拟机唯一id(LVMID,local virtual mechine identifier)。jps命令格式jps [options] [host原创 2020-08-25 15:04:16 · 685 阅读 · 0 评论 -
map容器
map容器hashmaphashmap的结构和底层原理hashmap就是用来存放key-value数据结构的容器,在1.7以前是数组+链表,1.8是数组+链表+红黑树根据key计算每个元素的在数组存放的下标。然后用链表或者红黑树来解决由于hash函数造成的碰撞问题。插入规则1.8以前是头插法,新的节点会作为头节点保存在数组中,旧的头节点会放置在新节点之后1.8以后是尾插法,在尾部进行插入1.7尾插导致的循环因为1.7的resize会导致链表倒序,原本尾节点变成原本的头节点。那next指针原创 2020-08-03 22:32:23 · 187 阅读 · 0 评论 -
算法学习13——红黑树
文章目录红黑树红黑树的性质红黑树的插入红黑树红黑树是一棵二叉搜索树,拥有二叉搜索树的性质:左子树的所有值小于根节点,右子树的所有值大于根节点。同时还具有近似平衡性质,近似平衡指的是任何节点的左右子树高度不会超过一半。它相对平衡二叉树的优势在于,任何不平衡都可以在三次之内的旋转解决,而平衡二叉树最坏会达到树的高度级别的旋转次数。红黑树的性质红黑树节点除了左节点,右节点,关键字的值三个基本二叉树元素之外,还维护了红黑色作为标记。同时null被定义成为叶子节点,具有关键字的节点被定义成为内部节点。红黑树原创 2020-07-27 22:40:42 · 569 阅读 · 0 评论 -
java多线程开发09——线程通信
java多线程开发09——线程通信wait方法wait()方法就是使线程停止运行,会释放对象锁。wait()方法会使当前线程调用该方法后进行阻塞,并且将该线程置入锁对象的等待队列中,直到接到通知notify或被中断interrupt为止。wait()方法只能在同步方法或同步代码块中调用,如果调用wait()时没有适当的锁,会抛出异常。wait()方法执行后,当前线程释放锁,其他线程可以竞争该锁。wait()方法被中断或者notify后,不会立刻获取锁,需要重新竞争notif原创 2020-07-26 22:12:37 · 136 阅读 · 0 评论 -
java多线程开发08——中断interrupt
java多线程开发-8——中断interrupt有三个方法和中断有关:public void interrupt():线程对象的成员方法,调用此方法,可以向线程内发送中断信号,有一些原生方法可以捕捉中断信号从而抛出被中断异常InterruptException,同时会线程内的中断标志会变成true。public static boolean interrupted():Thread的静态方法,调用此方法,可以查看当前线程是否被中断,即查看中断标志,需要说明的是,标志为true时,调用一次会自动把标志原创 2020-07-26 21:51:17 · 168 阅读 · 0 评论 -
java多线程开发07——final
java多线程开发07——final对final域,编译器和处理器要遵守两个重排序规则。在构造器函数内对一个final域的写入,随后把这个被构造的对象赋值给引用变量,两个操作不能重排序。即构造函数中对一个final域的写入构造完把对象赋值给引用变量初次读取一个包含final域的对象引用,随后初次读这个final域,两个操作不能重排序。即初次读取一个包含final域的对象引用初次读取这个final域...原创 2020-07-26 20:12:58 · 97 阅读 · 0 评论 -
java多线程开发06——锁和内存屏障
java多线程开发06——锁和内存屏障资源来自:原文链接锁概述我们知道线程安全问题的产生前提是多个线程并发访问共享变量、共享资源(以下统称为共享数据)。于是,我们很容易想到保障线程安全的方法将多个线程对共享数据的并发访问转换为串行访问,即一个共享数据一次只能被一个线程访问,该线程访问结束后其他线程才能对其进行访问。锁(Lock)就是利用这种思路以保障线程安全的线程同步机制。按照上述思路,锁可以理解为对共享数据进行保护的许可证。对于同一个许可证所保护的共享数据而言,任何线程访问这些共享数据前必须先持有转载 2020-07-26 19:22:55 · 541 阅读 · 1 评论 -
java多线程开发05——相对顺序问题
文章目录java多线程开发05——相对顺序问题顺序一致性as-if-serialhappens-before规则java多线程开发05——相对顺序问题程序员为了开发方便,希望写的程序可以按他们写的逻辑,一行一行执行。而处理器设计者,考虑到如果逐行执行,一方面效率低:每个变量写入和读取都从主存的话IO开销太大;一方面无法发挥多核处理器的优势:如果是一行一行串行执行指令只能在一个CPU上执行程序。因此,现代CPU每个处理器都有自己的读写缓存区,用以批量地更新变量。然后通过优化指令的手段,将指令代码在多个C原创 2020-07-25 15:01:07 · 211 阅读 · 0 评论 -
java多线程开发04——内存模型
文章目录java多线程开发04——内存模型并发编程线程同步问题java内存模型重排序重排序和内存屏障java多线程开发04——内存模型并发编程线程同步即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态**临界区(线程维护):**通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后原创 2020-07-25 11:32:40 · 104 阅读 · 0 评论 -
算法学习12——区间合并
区间合并给出一个区间的集合,请合并所有重叠的区间。思路按区间左端进行排序扫描排序后的区间,进行排序原创 2020-07-24 11:17:32 · 113 阅读 · 0 评论 -
算法学习11——位运算
位运算求n的二进制表示中的第k位的值x=n>>kx&1lowbit,返回x的最后一位1:x&(-x)基于lowbit计算x中二进制表示中1的个数每次减轻最后一位1,计算次数源码:x,反码:~x,补码:~x+1=-x...原创 2020-07-24 11:15:35 · 162 阅读 · 0 评论 -
算法学习10——java中的map
文章目录算法学习10——java中的mapmap接口AbstractMap抽象Map域方法HashMap域静态类方法算法学习10——java中的mapmap接口定义了一个用来把keys映射到maps的对象,一个map不能包含重复key,每个key最多映射一个value的值这个提供三个collection视图,允许返回keys的set,values的collection,和key-value的键值对映射。如果将可变对象作为键值需要格外注意方法功能int size();返回原创 2020-07-21 09:10:32 · 363 阅读 · 0 评论 -
算法学习09——计数、基数、桶排序
文章目录计数、基数、桶排序计数排序基数排序桶排序计数、基数、桶排序嘿嘿嘿,懒得写代码了计数排序计数排序的思想和实现都很简单,就是统计每个元素出现的次数,然后迭代每个元素的次数进行排序基数排序获取最大的数获取最大的数的位数按照低位的数字,使用稳定的排序算法,对数组进行排序类似的思路,使用稳定的算法从低位到高位,对数组进行排序桶排序将数组划分成为多个区间每个区间进行排序...原创 2020-07-20 19:15:48 · 200 阅读 · 1 评论 -
算法学习08——快速排序
快速排序此处只有一个我背的滚瓜烂熟的模板public void quickSort(int[] arr, int left, int right){ if(left >= right) return; int i = left - 1; int j = right + 1; int x = arr[left]; while(i < j){ while(arr[++i] < x); while(arr[--j] &g原创 2020-07-20 18:47:09 · 110 阅读 · 0 评论 -
算法学习07——堆操作
文章目录堆操作基本操作插入和弹出最大的元素从一个数组建立堆序堆排序源码堆操作基本操作上滤: private void percolateUp(int index){ //如果以及到达根节点,无法继续上滤,返回即可 if(index==0) return; //获得父节点 T parent = (T)elements[(index-1)/2]; //当前节点 T current = (T)elements[index]; //父节点比当前原创 2020-07-20 17:09:47 · 230 阅读 · 0 评论 -
算法学习06——堆
文章目录~~堆~~二叉堆堆操作建堆堆排序堆**堆序性质:**和普通的树不同的是,堆具有堆序性质。所谓堆序性质,即堆的根节点要比所有字节点大,并且递归地具有此性质。即树根比左孩子和右孩子要大,同时左孩子在左子树中最大,右孩子在右子树中最大。**结构性质:**类似完全二叉树,底层上的元素被全部填满,底层从左往右填入元素。二叉堆二叉堆即每个节点最多只有两个节点的堆结构,每个节点(序号i)的父节点,左子节点,右子节点具有如下的变换关系父节点: ⌊i/2⌋\left \lfloor i/2 \ri原创 2020-07-20 12:40:07 · 75 阅读 · 0 评论 -
java多线程开发03——CAS
文章目录java多线程开发03——CASCAS 是怎么实现线程安全的?存在问题java多线程开发03——CAScas全称是Compare and Swap,即比较再交换,乐观锁的一种实现方式,是一种轻量级锁,JUC 中很多工具类的实现就是基于 CAS 的。CAS 是怎么实现线程安全的?线程在读取数据时不进行加锁,在准备写回数据时,先去查询原值,操作的时候比较原值是否修改,若未被其他线程修改则写回,若已被修改,则重新执行读取流程。比较+更新 整体是一个原子操作存在问题循环时间长CPU开销大:原创 2020-07-07 20:56:50 · 114 阅读 · 0 评论 -
java多线程开发02——synchronized
文章目录java多线程开发02——synchronizedsynchronized应用对象头偏向锁轻量级锁java多线程开发02——synchronized偏向锁、轻量级锁是JVM级别实现的重量级锁是操作系统级别实现的JUC是JDK级别实现的synchronized应用对于普通方法,锁是当前实例对象对于静态同步方法,锁是当前类的Class对象对于同步方法块,锁是Syschronized括号里配置的对象对象头锁的状态通过java对象头进行区分。syschronized用的锁是存原创 2020-07-07 20:56:05 · 176 阅读 · 0 评论 -
java多线程开发01——volatile
文章目录java多线程开发01——volatilevolatile可见性禁止指令重排序java多线程开发01——volatilevolatile一但一个共享变量(类成员变量,类静态成员变量) 被volatile修饰后那么就具备了以下两层语义(1)保证不同线程对其的可见性,即不同线程修改该变量,新值对于其他线程是立即可见的。(2)禁止指令重排序。可见性所谓可见性,是指某个线程对volatile修饰的变量进行修改,其他线程可见修改后的内容。基于以下两点实现这个功能:将当前处理器缓存行的数据写回原创 2020-07-04 21:04:59 · 156 阅读 · 0 评论 -
netty学习笔记09——filechannel的使用
文章目录netty学习笔记09——filechannel的使用netty学习笔记09——filechannel的使用写入内容import java.io.FileOutputStream;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;public class NIOFileChannelWriter { public static void main原创 2020-06-02 18:24:34 · 445 阅读 · 1 评论 -
netty学习笔记08——Channel
文章目录netty学习笔记08——Channel基本介绍netty学习笔记08——Channel基本介绍NIO的通道(channel)类似流,但是有以下的区别:通道可以同时进行读写(双工),而流只能读或者只能写(单工)通道可以实现异步读写数据通道可以从缓冲读数据,也可以写数据到缓存Channel在NIO中是一个接口public interface Channel extends Closeable()A channel represents an open connect原创 2020-06-02 18:17:21 · 248 阅读 · 0 评论 -
netty学习笔记06——NIO三大组件的关系
netty学习笔记06——NIO三大组件的关系每个channel都会对应一个bufferselector对应一个线程,一个线程对应要给channel(连接、socket)程序切换到哪个channel是由事件决定的selector会根据不同的事件,在各个通道上切换buffer就是一个内存块,底层是有一个数组数据的读取写入是通过Buffer,这个和BIO有本质不同的。bio是面向流的,流有输入输出,不能双向。buffer可以读也可以写channel也是双向的...原创 2020-05-27 16:55:05 · 228 阅读 · 0 评论 -
netty学习笔记07——缓冲区Buffer
文章目录netty学习笔记07——缓冲区Buffer基本介绍重要参数相关API阅读构造bufferBuffer的创建flip()方法行为Get()和Put()行为netty学习笔记07——缓冲区Buffer基本介绍缓冲区Buffer,缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(含数组),该对象提供了一组方法,可以更轻松地使用内存块,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel提供从文件、网络读取数据 渠道,但是读取或写入的数据都必须经由Buffer原创 2020-05-27 16:54:09 · 430 阅读 · 0 评论 -
netty学习笔记05——buffer的使用
文章目录netty学习笔记05——buffer的使用一个简单的demonetty学习笔记05——buffer的使用一个简单的demopublic class BasicBuffer { public static void main(String[] args) { //创建一个buffer,大小为5,即可以存放5个int IntBuffer intBuffer = IntBuffer.allocate(5); //向buffer中存放数据原创 2020-05-27 10:02:50 · 179 阅读 · 0 评论 -
netty学习笔记04——初识NIO
文章目录netty学习笔记04——初识NIOnetty学习笔记04——初识NIONIOTimeServer:public class NIOTimeServer { public static void main(String[] args){ int port = 8080; if(args!=null && args.length > 0 ){ tr...原创 2020-05-01 23:56:45 · 195 阅读 · 0 评论 -
netty学习笔记03——利用线程池来处理连接
文章目录netty学习笔记03——利用线程池来处理连接netty学习笔记03——利用线程池来处理连接基于线程池的socket服务器public class BIOTimeServerThreadPool { public static void main(String[] args){ int port = 8080; if(args!=null && args.l...原创 2020-05-01 23:55:48 · 277 阅读 · 0 评论 -
netty学习笔记02——java如何使用socket通信呢
文章目录netty学习笔记02——java如何使用socket通信呢netty学习笔记02——java如何使用socket通信呢传统的BIO通信模型是这样的:服务端接受连接,把连接封装成为socket,把这个socket对象交给新的线程处理。服务端接受连接的代码:public class BIOTimeServer { public static void main(String[] ...原创 2020-04-30 10:59:48 · 244 阅读 · 0 评论 -
netty学习笔记01——IO多路复用模型
文章目录netty学习笔记01——IO多路复用模型阻塞I/O模型非阻塞I/O模型i/o多路复用poll方法select方法epoll方法信号驱动I/O模型异步I/Onetty学习笔记01——IO多路复用模型阻塞I/O模型阻塞i/o模型就是常见的io模型,请看如下的一个例子:server = new ServerSocket(port);server.accept();上述的代码会被阻...原创 2020-04-28 22:13:20 · 620 阅读 · 0 评论 -
java异步03——Future
文章目录java异步03——FutureFuture接口FutureTask用法java异步03——FutureFuture接口Future接口一共有5个接口方法V get() throws InterruptedException, ExecutionException:等待异步计算任务完成,并返回结果;如果当前任务计算还没有完成则会阻塞调用线程直到任务完成;如果在等待结果的过程中的有...原创 2020-04-28 22:01:20 · 209 阅读 · 0 评论 -
java异步02——多线程
文章目录java异步02——多线程显式创建线程线程池没有返回值的任务有返回值的任务java异步02——多线程用多线程的方式来实现异步效果。就是在主线程开启一个新线程去处理任务,然后去取这个任务结果。一个在非异步的例子:public class AsynchronousByUseThread { public static void doSomethingA(){ try{ Th...原创 2020-04-28 10:09:39 · 297 阅读 · 0 评论 -
java异步01——初识reactor
文章目录java异步01——初识reactorreactor介绍FluxMono简单看一下Flux和Mono的api订阅generatecreatehandleSchedulers线程模型异常处理常规处理transform操作符java异步01——初识reactorreactor介绍Reactor是一个面向JVM(这意味着支持kotlin或者其他语言)的非阻塞响应式编程,具有高效的deman...原创 2020-04-28 01:34:37 · 973 阅读 · 0 评论 -
ThreadLocal的原理和内存泄露
文章目录ThreadLocal的原理和内存泄露ThreadLocal的用法原理内存泄露隐藏的问题解决办法ThreadLocal的原理和内存泄露ThreadLocal的用法ThreadLocal可以保证一个线程共享一个变量,例如static ThreadLocal<String> threadLocal = new ThreadLocal<>();public st...原创 2020-04-28 00:44:49 · 278 阅读 · 0 评论 -
问题记录
文章目录spring源码里有个很奇怪的操作spring源码里有个很奇怪的操作 public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException { Assert.notNull(encodedResource, "EncodedResource must n...原创 2020-04-08 17:16:08 · 179 阅读 · 0 评论 -
JVM学习03——OOM
文章目录JVM学习03——OOMjava堆溢出虚拟机栈和本地方法栈溢出方法区和运行时常量池溢出本机直接内存溢出JVM学习03——OOM在java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都会发生OutOfMemoryError异常的可能。java堆溢出通过命令:java -Xmx20m -Xms20m -XX:+HeapDumpOnOutOfMemoryErro...原创 2020-04-05 16:19:48 · 134 阅读 · 0 评论 -
JVM学习02——从虚拟机的角度看java对象的创建
文章目录JVM学习02——从虚拟机的角度看java对象的创建对象的创建流程如何分配内存资源竞争对象布局对象的访问定位JVM学习02——从虚拟机的角度看java对象的创建对象的创建流程从jvm的角度,对象的创建具有以下的流程当jvm遇见了new指令检查常量池是否能定位到一个类的符号引用,如果没有的话就执行类加载流程,如果有的话就进行下一步给对象分配内容把内存空间初始化为零值设置对...原创 2020-04-02 20:54:11 · 236 阅读 · 0 评论 -
JVM学习01——jvm运行时数据区域
文章目录JVM学习01程序计数器(program counter register)虚拟机栈(JAVA Virtual Machine Stacks)本地方法栈java堆方法区动态常量池jvm中的常量池字符串常量池(String Constant Pool):class常量池(Class Constant Pool):运行时常量池(Runtime Constant Pool):常量池的好处直接内存...原创 2020-04-01 00:02:31 · 353 阅读 · 0 评论 -
StringBuffer和StringBuilder的区别
文章目录StringBuffer和StringBuilderStringBuffer和StringBuilderStringBuffer的方法添加了synchronized关键字,使其在很多情况下是线程安全的。StringBuilder不是线程安全的。相应的StringBuffer开销大很多。...原创 2020-03-17 00:04:46 · 116 阅读 · 0 评论 -
docker 安装 nacos/nacos-server 镜像并配置本地数据库
https://blog.youkuaiyun.com/HXNLYW/article/details/97101028转载 2020-03-12 11:37:47 · 1008 阅读 · 0 评论 -
hadoop搭建(二)——集群搭建
文章目录hadoop搭建(二)hadoop集群搭建目的预先准备安装配置无安全模式的hadoop配置hadoop守护进程环境配置hadoop守护进程管理节点情况运行hadoop集群hadoop运行hadoop停止hadoop搭建(二)本文档翻译hadoop的集群搭建,说明来自:Hadoop Cluster Setuphadoop集群搭建目的这篇文档说明了从一些节点到数以千记的大量节点的安装...原创 2019-04-20 22:00:32 · 493 阅读 · 0 评论