- 博客(40)
- 收藏
- 关注
原创 RabbitMQ
一、简介RabbitMQ 是使用Eelang语言开发的开源消息队列系统,基于AMQP协议来实现,AMQP主要的特征是面向对象、队列、路由(包括点对点和发布订阅、可靠性、安全、)。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求比较高的场景,对性能和吞吐量的要求其次。AMQP协议 是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受客户端中间件的不同产品,不同的开发语言等条件限制,Erl
2021-04-01 17:43:14
169
原创 Java 实现 TCP/UDP 协议连接
一、TCP协议(1)协议概述TCP:既传输控制协议,是一种面向连接的,可靠的,基于字节流的传输层通信协议,TCP旨在适应支持多网络应用的分层结构,连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。(2)工作方式三次握手:(建立连接)三次握手完成TCP客户端和服务端成功建立连接,可以传输数据;客户端发送SYN( SEQ=X )报文给服务器端,进入SYN_SEND状态。服务器端收到SYN报文,回应一个SYN( SEQ=Y ) ACK ( ACK = x+
2021-01-11 12:12:06
714
原创 Java 中的线程池
1. 线程池的实现原理(1)线程池的主要流程如下图所示:线程池判断核心线程池是否都在执行任务,不是,则创建一个新的工作线程来执行任务,是,则进入下个流程;线程池判断工作队列是否已经满,没满,则将新提交的任务存储在这个工作队列里,满了,则进入下一个流程;线程池判断线程池的线程是否都处于工作状态,没有,则创建一个新的工作线程来执行任务,是,则交给饱和策略来处理这个任务;(2)ThreadPollExecutor 执行 execute 方法的 4 中情况如果当前运行的线程少于 coreP
2020-09-14 21:54:16
162
原创 Java 中的阻塞队列
1. 什么时阻塞队列阻塞队列 是一个支持两个附加操作的队列,如下:支持阻塞的插入方式 :当队列满时,队列会阻塞插入元素的线程,直到队列不满;支持阻塞的移除方式 :当队列为空时,获取元素的队列会等待队列为非空;2. 插入和移除操作的四种处理方式方法/处理方式抛出异常返回特殊值一直阻塞超时退出插入方式add(e)offer(e)put(e)offer(e,time,unit)移除方法remove()poll()take()poll(time.unit
2020-09-13 21:37:13
143
原创 ConcurrentHashMap 实现原理与使用
一、ConcurrentHashMapConcurrentHashMap 采用锁分段技术有效提高了并发访问率,首先将数据分成一段一段地存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问;1. ConcurrentHashMap 的结构ConcurrentHashMap 由 Segment 数组结构 和 HashEnty 数组结构组成,一个ConcurrentHashMap 里面包含一个 Segment 数组(数组链表结构),一个 Segmen
2020-09-13 18:34:07
5176
2
原创 Java 中的锁
一、Lock 接口1. 主要特性特性描述尝试非阻塞获取锁当前线程尝试获取锁,如果这一刻锁没有被其他线程获取到,则成功获取并持有锁;能被中断地获取锁获取到锁的线程能够响应中断时,中断异常将会被抛出,同时锁会被释放;超时获取锁在指定的截止时间之前获取锁,如果截至时间到了任就无法获取锁,则返回;2. API方法名称描述void lock()获取锁,调用该方法当前线程将会获取锁,当锁获得后,从该方法返回void lockInterruot
2020-09-10 12:44:47
93
原创 Java 内存模型
一、Java 内存模型的基础1 . 并发编程模型的两个关键问题通信 :是指线程之间以何种机制来交换信息,通信机制为共享内存 和 消息传递;同步 :是指程序中用于控制不同线程间操作发生相对顺序的机制;2 . Java 内存模型的抽象结构Java 中实例域,静态域和数组元素都存储在堆内存中,堆内存在线程之间共享,而局部变量,方法参数和异常处理器参数不会在线程之间共享JMM 定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了该
2020-09-06 11:44:33
143
原创 Java并发机制的底层实现原理
一、volatile 的应用volatile 是轻量级的 synchronized ,它在多处理器开发中保证了共享变量的可见性,可见性是指当一个线程修改一个共享变量时,另一个线程能读到这个修改的值;1 . 定义Java 编程语言允许线程访问共享变量,为了确保共享变量能被准确个一致地更新,线程应该确保通过排他锁单独获得这个变量。如果一个字段被声明称 volatile,Java内存模型确保所有线程所看到的这个变量的值是一致的。2 . 实现原理(1)LOCK 前缀指令会引起处理器缓存回写到内存
2020-09-04 09:00:25
98
原创 并发编程的挑战
一、并发编程得挑战1 . 上下文切换CPU 通过给每个线程分配 CPU 时间片,并且不停的切换线程执行,让我们感觉到多个线程是同时执行的,所以任务从保存到再加载的过程就是一次上下文切换(1)减少上下文切换的方法无锁并发编程 :处理多线程数据时。可以用一些方法来避免使用锁,如将数据的 ID 按照 Hash 算法取模分段,不同的线程处理不同的数据;CAS 算法 :Java 的 Atomic 包使用 CAS 算法来更新数据,而不需要加锁;使用最小线程 :避免创建不需要的线程;协程 :再
2020-08-27 09:19:32
119
原创 前端编译优化
三类编译产品:前端编译器:JDK 的 Javac ,Eclipse JDT 中的增量式编译器;即时编译器:HotSpot虚拟机的 C1 ,C2 编译器,Graal 编译器;提前编译器:JDK 的 Jaotc,GNU Cmplier for the Java一、Javac 编译器(1)Javac 的源码与调试编译过程大致分为一个准备过程和三个处理过程:准备过程:初始化插入式注解处理器。解析与填充符号表过程,包括语法语义分析:将源代码的字符流转变为标记集合,构造出抽象语法树。填充符号.
2020-06-12 19:53:25
161
原创 虚拟机字节码执行引擎
不同虚拟机实现中,执行引擎在执行字节码得时候通常会有解释执行和编译执行两种选择,也可能两者兼具,还有可能同时包含几个不同级别得即使编译器一起工作得执行引擎,但是所有 Java 虚拟机得执行引擎输入,输出都是一致得:输入的是字节码二进制流,处理过程是字节码解释执行的等效过程,输出的是执行结果;一、运行时栈帧结构java 虚拟机以方法作为最基本的执行单元,栈帧则是支持虚拟机进行方法调用和方法执行背后的数据结构,它也是虚拟机运行时数据区域中虚拟机栈的栈元素,每一个栈帧都包括了局部变量 ,操作数栈,动态.
2020-06-11 20:12:27
99
原创 虚拟机类加载机制解析
一、类加载的时机(1)类加载的步骤一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期都将经历加载,验证,准备,解析,初始化,使用和卸载七个阶段,其中验证,准备,解析三个部分统称为连接。(2)类加载的顺序加载,验证,准备,初始化和卸载这五个阶段的顺序是确定的,而解析阶段在某种情况下可以在初始化阶段之后再开始,这是为了支持 Java 语言的运行时绑定特性。重要的一点是:这些阶段都是互相交叉地混合进行,会在一个阶段执行的过程中调用,激活另一阶段。初始化阶段:有六种情况必须立
2020-06-08 20:05:56
124
原创 Class 类文件结构解析
一、Class 类文件结构Class 文件是一组以 8 个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在文件中,中间没有任何分隔符,这使得 Class 文件中存储的内容几乎全是程序运行的必要的数据,没有空隙存在。Class 文件格式采用一种类似于 C 语言结构体的伪结构来存储数据,这种微结构只有两种数据类型:无符号数:属于基本的数据结构,以 u1,u2,u4,u8 来分别表示 1 个字节, 2 个字节 , 34个字节 ,8 个字节的无符号数,无符号数可以用来描述数字,引索引用,
2020-06-06 08:49:08
211
原创 虚拟机性能监控工具和故障处理工具
一、基础故障处理工具其主要是用来监视虚拟机的运行状态和进行故障处理,根据可用性个授权的不同可以分为三类:1 . 商业授权工具:主要是 JMC (Java Mission Control)及它要用到的 JFE。2 . 正式支持工具:属于被长期支持的工具,不同版本和 JDK 之间会存在差异,3 . 实验性工具:这类工具在在使用说明中被声明是 “ 没有技术支持的 ” 并且是实验性质的,可转正,也可消失。JDK开发团队采用 Java 语言来实现故障处理工具的原因:当应用程序被部署到生产环境中后,
2020-06-05 10:02:29
160
原创 常见的垃圾回收算法和垃圾收集器
从如何判断消亡的角度出发,垃圾收集算法可分为:“ 引用计数式垃圾收集 ” 和 “ 追踪式垃圾收集 ” 。也被称为: “直接垃圾收集 ” 和 “ 间接垃圾收集 ” 。(1)分代收集理论大多数商业虚拟机都遵循分代收集的理论,它建立在两个假说之上:弱分代假说:绝大多数对象都是朝生夕灭的。强分代假说:熬过越多次垃圾收集过程的对象越难被回收。跨代引用假说:跨代引用相对于同代来说仅占极少数。前两条假说共同奠定了多款常用的垃圾收集器的统一设计原则:垃圾收集器应该将 Java 堆划分出不同的区域.
2020-05-25 13:00:24
259
原创 如何判断一个对象已经死亡?
一、判断对象是否已经死亡的方法(1)引用计数法基本思路:在一个对象中添加一个引用计数器,每当有一个地方引用他时,计数器的值就加一;当引用失效时,计数器减一;任何时刻计数器为零的对象是不可能再被使用的(对象已死亡)。弊端:需要配合大量额外处理才能保证正确的工作,例如:对象之间的循环引用(2)可达性分析算法基本思路:通过一系列称为 “GC Roots” 的跟对象为起始节点集,从这些结点开始,根据引用关系乡下搜索,搜索过程所走过的路径称为 “引用链” ,如果某个对象到 GC Roots 间没有
2020-05-22 10:49:53
681
原创 虚拟机中对象的创建
一、对象的创建1. Java创建对象的四种方式(1)通过 new 语句来实例化一个对象;(2)通过反射机制创建对象;(3)通过 clone()方法(复制)创建对象;(4)通过反序列化的方式创建;2.虚拟机创建对象的过程(1)当虚拟机遇到一条字节码 new 指令时,首先检查这个指令的参数是否能在常量池中找到一个类的符号引用,并且检查这个符号引用代表的类是否被加载,解析,初始化过,如果没有,就必须先执行类加载过程;(2)虚拟机为新生对象分配内存空间有如下两种分配方式:指针碰撞
2020-05-10 08:44:47
199
原创 Java运行时数据区域都有哪些部分
一、Java运行时数据区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为多个数据区域,有的区域区域随着虚拟机进程的启动而一直存在,有些则是随着用近乎线程的启动和结束而建立和销毁。(1)程序计数器程序计数器可以看作是当前线程所执行的字节码行号指示器,也是程序控制流的指示器,用来完成分支,循环,跳转,异常处理,线程恢复等基础操作,每条线程都有自己独立的程序计数器,所以称它...
2020-05-07 10:40:52
419
原创 各个JDK版本的新特性
一、各个JDK版本的新特性(1)JDK 5 :1 . 自动装箱2 . 泛型3 . 动态注释4 . 枚举5 . 可变长参数6 . 遍历循环7 . 改进了 Java 的内存模型8 . 提供了 java.until.concurrent 并发包(2)JDK 6 :1 . 提供了动态语言的支持( 通过内置 Mozilla JavaScript Rhion 引擎实现 )2 ....
2020-04-25 19:38:12
275
原创 Java技术体系概述
一、Java技术体系(1)Java技术体系包括一下几个组成部分:1 . Java程序设计语言2 . 各种硬件平台上的Java虚拟机实现3 . Class文件格式4 . Java类库API5 . 来自商业机构和开源社区的第三方类库(2)Java技术体系的四条主要的产品线:1 . Java Card:支持小程序(Applets)运行在小内存设配上的平台。2 . Java ME:...
2020-04-21 11:50:53
2374
1
原创 Ssrvlet技术
1.工作原理动作原理如上图所示,其工作流程如下五个步骤:Servlet接收浏览器发出的请求。Servlet根据不同的请求调用相应的JavaBean.JavaBean按照子的业务逻辑,通过JDBC操作数据库。Servlet将结果传给了JSP。JSP将后台处理结果传给了浏览器。...
2020-03-12 14:52:10
167
原创 如何求出最大子数组之和
问题描述:一个有n个元素的数组,元素中有正有负,数组中一个或者连续多个元素可以组成一个子数组,求子数组中和最大的?方法一:暴力法三层循环,找出所有的子数组,并求出他们对应的和,再取最大值。代码如下:package Array;public class MaxSubArray { //求最大子数组之和 public static int maxSubArray(int ar...
2020-02-11 10:22:35
781
原创 链表的实现
一、节点的创建及使用创建一个节点类,并应以节点内容,下一个节点和构造方法public class Node { //一个节点 //节点内容 int data; //下一个节点 Node next; public Node(int data) { this.data = data; }追加节点先定义一个当前节点,循环找到当前节点的下一个节点,每次循环...
2020-02-09 08:52:46
167
原创 树和二叉树
树结构概述根节点:该节点没有父节点双亲结点:有父节点和子节点子节点:一个节点的下面一个节点为子节点路劲:从根节点访问其他节点要经过的节点节点的度:一个节点后面的子节点数节点的权:该节点储存的数据叶子节点:没有子节点的节点子子树:除根节点外所有的节点以下的所有节点层:同一个节点的所有子节点所在的地方树的高度:从根节点开始到最远叶子节点的距离森林:由好多树...
2020-02-09 08:43:45
91
原创 多线程
一、线程是什么?与进程有什么区别?线程也被称为轻量级进程,也是程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内存空间(代码段,数据段,堆空间),以及一些进程的资源(列入打开的文件),但是各个线程拥有自己的栈空间。二、使用多线程的优点(1)使用过线程可以减少程序的响应时间。在单线程(单线程指的是程序执行过程中只有一个有效操作的序列,不同操作之间都有明确的执行先后顺...
2020-02-09 08:21:14
89
原创 HashMap,HashTable,TreeMap,WeakHashMap有那些区别?
一、HashMap,HashTable,TreeMap,WeakHashMap有那些区别?java为数据结构中的映射定义了一个接口 java.util.Map。它包括三个实现类:HashMap,HashTable,TreeMap。Map是用来存储键值对的数据结构,在数组中通过数组下标来对其内容引索,而在Map中是通过对象进行引索,用来引索的对象叫做key,其对应的对象叫做value。(1)...
2020-01-23 11:16:28
107
原创 String,StringBuffer,StringBuilder,StringTokenizer又哪些区别?
一、String ,StringBuffer,StringBuilder,StringTokenizer有哪些区别?(1)String:String用于字符串操作,是不可变类,一旦被创建,其值将不能被改变。初始化时,既可以用构造函数String s1 = new String(“world”);,也可以用赋值 String s1 = “world”;的方法。实现String字符串修改...
2020-01-22 08:31:07
200
原创 值传递和引用传递的区别
一、值传递和引用传递方法调用是编程语言中非常重要的一个特性,在方法调用时通常需要传递一些参数来完成特定的功能。Java语言提供了两种参数传递的方式:值传递和引用传递。(1)值传递在方法调用中,实参会把它的值传递给形参,形参只是用实参的值初始化一个临潼是的存储单元,因此形参和实参虽然有着相同的值,但是却有着不同的存储单元,因此对实参的改变不会影响形参的值。(2)引用传递在方法调用...
2020-01-18 14:31:38
369
原创 break,continue,以及return 有什么区别?
一、break,continue,return有那些区别?1. break:break用于直接强行跳出当前循环,不再执行剩余的代码。当循环语句遇到break,忽略循环体中的任何其他语句和循环条件测试,程序控制在循环体后面的语句重新开始。当多层循环嵌套,并且break语句出现在循环中的内层循环中时,仅仅只是终止了内层的循环,而不影响外层循环的执行2.continue:continue用...
2020-01-17 19:21:50
434
1
原创 Java中的clone方法
一、clone方法的用法java中没有明确提出指针的概念与用法,而实际上每个new语句都返回的是一个指针的应用,只不过大部分情况下都不需要去关心如何去操作这个指针而已。开发人员往往不需要关心如何去操作这个指针,从而导致忽略了对象和引用的区别,实列如下:package clone;public class Obj { private String str = "default va...
2020-01-16 14:01:54
152
原创 数组和面向对象数组
一、数组数组的创建//创建数组 int array[] = new int[3];为数组中的元素进行赋值//为数组中的元素赋值 array[0] = 1; array[1] = 2; array[2] = 3;创建时为数组进行赋值//创建一个数组并赋值 int array[] = new int[] {1,2,3};输出数组中的所有元素...
2020-01-13 07:56:59
107
原创 求数组中的最大最小值
求数组中最大最小值的几种方法:问题分解法:遍历两次数组,反别求出最大值和最小值取单元素法:两个变量,变量min标记最小值,变量max标记最大值,每次循环取出一个元素来与最大值最小值比较。取双元素法:两个变量,变量min标记最小值,变量max标记最大值,每次循环取出两个元素,先比较两个元素的大小,小的和最小值比较,大的和最大值作比较。数组元素位移法:将数组中相邻两个数分在一组,每次比较两个...
2020-01-02 18:22:17
6006
原创 实现字符串反转
问题描述:把一个句子中的单词进行反转,反转之前:“how are you”,反转之后:“you are how”。具体步骤:(1)先将整个字符串反转,反转后为:“uoy era woh”。(2)再将每个单词反转过来,反转后为:“you are how”。首先编写一个反转数组元素的方法swap()。public void swap(char array[] ,int front,int...
2019-12-28 21:57:17
250
原创 如何实现二叉树的层次遍历
一、二叉树的层次遍历不同于二叉树先序遍历,中序遍历,后序遍历所用到的深度优先(DFS)思想,二叉树的层次遍历所用到的是广度优先(BFS)的思想,需要用到队列去实现。基本步骤:(1)先判断根节点非空,将根节点放入队列中。(2)循环判断队列非空,从队列中取出节点并打印该节点的值。(3)判断该节点的左右节点是否为空,不为空的话将其放入队列中。(4)重复以上步骤,直到队列为空结束。packa...
2019-12-27 08:57:43
1149
原创 二叉排序树的实现
一、二叉排序树1. 定义及性质:二叉排序树又称二叉查找树,它或者是一颗空树,或者具有一下性质的二叉树:(1)如果左子树不为空,那么左子树上面的所有节点的值都小于它的根节点的值。(2)如果右子树不为空,那么右子树上面的所有节点的值都大于它的根节点的值。(3)左右子树也分别为二叉排序树2. 代码实现:(1)先定义一个节点类,分别定义节点的权,左节点,右节点,和初始化构造方法packag...
2019-12-27 08:35:02
580
原创 队列的两种实现方式
一、链表实现队列的操作首先编写一个节点类package Queue;public class Node<E> { //节点类 //当前节点 E data; //下一个节点 Node<E> next; //构造方法 public Node(E data) { this.data = data; }}编写实现类MyQueue,首先定义...
2019-12-26 16:48:49
814
原创 栈的两种实现方式
一、数组实现栈首先定义一个数组来储存数据,定义一个变量来存储数组中储存元素得个数,编写一个构造方法来构造一个长度为十得数组。编写向栈中添加的元素得方法,首先需要查看栈是是否可以存储添加的元素,若数组已满的话则扩充数组容量。编写查看和取出栈顶元素的方法。代码如下:package MyStack;import java.util.Arrays;public class MySta...
2019-12-24 13:12:06
1945
1
原创 排序算法
一、冒泡排序基本原理:拿每个数与它的后一位数进行比较,如果前一位比后一位大,则调换位置。每轮比较都会将比较过的数中最大的放到最后面,下一轮会少比较一次。其代码只要有两层循环构成,外层循环控制比较的轮数,内层循环控制每轮比较比较的次数,并判断如果前一位比后一位大,则调换其位置,继续比较下一个数。package BubbleSort;import java.util.Arrays;p...
2019-12-23 16:31:19
109
原创 单链表的基本操作
一、向链表中插入数据首先先创建一个节点,判断头节点是否为空,如果为空的话就将将新节点付给头节点,如果不为空的话遍历找出尾节点,将新节点赋给为节点的后继节点。public class Node { Node next = null; int data; public Node(int data) { this.data = data; }}*****************...
2019-12-22 13:40:36
393
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人