
Java基础
文章平均质量分 90
Java基础
问道玄霄
初见惊艳,再见依然
展开
-
jdk20-虚拟线程简单了解
jdk的平台线程和操作系统的线程处于两钟不同的状态,前者属于用户态, 后者属于内核态, 虽然jdk的平台线程和os的线程存在映射关系, 但是操作系统调度线程后,需要从内核态切换到用户态,若JDK创建大量平台线程,这个状态切换过程是会耗费时间;jdk实现虚拟线程、虚拟线程是用户进程中,属于用户态,由JDK调度,因此不存在状态切换,性能上会有所提高,这种在操作系统中好像被称为“协程”。虚拟线程由JDK进行调度, JDK中每个平台线程可以运行不同的虚拟线程;一个虚拟线程在不同时间段可在多个平台线程上中运行;原创 2023-05-11 10:43:31 · 1024 阅读 · 1 评论 -
Java基础学习记录----泛型使用
Java百战成仙原创 2022-02-19 22:20:32 · 555 阅读 · 13 评论 -
java工厂模式
工厂模式工厂模式传统方式创建一类对象优缺点简单工厂模式工厂方法模式应用场景与优点抽象方法模式应用场景优点JDK源码中的应用:工厂方法与抽象工厂的区别工厂模式工厂模式分为简单工厂、工厂方法与抽象工厂模式;传统方式创建一类对象Pizza.javapackage com.yxj.factory.simplefactory.pizzastore.pizza;//将Pizza 类做成抽象public abstract class Pizza { protected String name; //名原创 2021-07-09 15:49:23 · 362 阅读 · 0 评论 -
Netty编解码&粘包拆包&心跳机制&断线自动重连
Netty编解码&粘包拆包&心跳机制&断线自动重连Netty编解码ChannelHandlerChannelPipeline编码解码器Netty粘包拆包解决方案Netty心跳检测机制使用与源码Netty断线自动重连实现Netty编解码Netty涉及到编解码的组件有Channel、ChannelHandler、ChannelPipe等,先大概了解下这几个组件的作用。ChannelHandlerChannelHandler充当了处理入站和出站数据的应用程序逻辑容器。例如,实现C原创 2021-07-08 00:35:40 · 906 阅读 · 0 评论 -
Netty彻底入门
Netty线程模型Netty介绍Netty使用场景Netty线程模型Netty组件Netty示例代码Netty介绍NIO的类库和API复杂,需要熟练掌握Selector、ServerSocketChannel、SocketChannel,ByteBuffer等;导致开发工作量和难度都非常大;例如:断线重连、网络闪断、心跳处理,网络阻塞、异常处理等;Netty对JDK自带的NIO的API进行了良好的封装,解决了上述问题。且Netty具有高性能、吞吐量、低延迟;Netty使用场景互联网行业:Du原创 2021-07-07 19:15:35 · 793 阅读 · 10 评论 -
Session、Cookie、Token、单点登录
Session、Cookie、Token、单点登录HTTP无状态Cookiecookie认证流程图缺点Session认证过程session认证的流程图token认证token认证的流程图优缺点JWT认证JWT认证流程图基于session认证的单点登录单点登录基于session认证的单点登录流程图基于JWT的单点登录Cookie 和 Session 的区别Token 和 Session 的区别Token 和 JWT 的区别相同区别使用 cookie 时需要考虑的问题使用 session 时需要考虑的问题分布式原创 2021-05-22 02:00:20 · 4779 阅读 · 1 评论 -
WebSocket并搭建简易聊天室
WebSocketWebSocketWebSocket特点代码基本框架客户端服务端代码示例发送与接收客户端实现服务端实现长连接在线聊天室设计思路客户端服务端代码存在的问题用户身份解决方法用户姓名的显示代码并发优化解决方法WebSocketWebSocket,是一个基于TCP的通讯协议,适用于网站应用。HTTP:短连接的TCP协议WebSocket: 长连接的TCP协议常见的应用场景:基于Web的聊天室、在线客服WebSocket特点单一TCP长连接,采用全双工通信模式(HTTP是半双工,原创 2021-07-05 23:48:15 · 3928 阅读 · 5 评论 -
一文必懂-长任务与解压缩Zip压缩文件
长任务与解压缩Zip压缩文件长任务长任务练习示例代码Zip查看目录示例代码解压缩示例代码综合Demo总结长任务需要较长的时间完成需要显示进度需要显示结果工作经常会有一些耗时间的操作,例如上传、下载、编码、解码 …长任务练习拷贝文件时,当文件较大时(几个G)应显示进度.长任务执行时,应该注意释放CPU不要过于频繁的更新显示,一般0.5~1秒更新一次示例代码package my;import java.awt.Container;import java.awt.FlowLay原创 2021-07-04 22:16:43 · 760 阅读 · 3 评论 -
Java日常业务开发中的IO流与装饰器模式、IO模型
业务开发中常见的IO流、IO模型原创 2021-07-03 01:46:07 · 1226 阅读 · 8 评论 -
数据结构与算法-赫夫曼树
赫夫曼树赫夫曼树介绍赫夫曼编码构建赫夫曼树代码实现赫夫曼树满二叉树:除了叶子节点,其他的都有两个子节点,1 2 4 8这样的节点 2^n个点完全二叉树:除了最底层都有两个子节点,而且叶子节点是靠左连续的;计算下面三颗二叉树的带权路径长度总和:其中每个点的权重为:a:7 b:5 c:2 d:4WPL(a):72+52+22+42=36()WPL(b):73+53+21+42=46()WPL©:71+52+23+43=35()介绍给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带原创 2021-06-24 01:16:20 · 215 阅读 · 7 评论 -
Redis多级缓存架构、缓存设计、布隆过滤器
Redis多级缓存架构、缓存设计、性能优化多级缓存架构缓存设计缓存穿透解决方法缓存雪崩解决方案多级缓存架构Nginx层:Lua动态渲染模板一些静态资源、例如HTML、CSS、JS、图片资源等都可以独立部署在一台服务器上、加载进Redis缓存中。用户请求经过Nginx时、判断是否为静态资源、是则直接从静态资源服务器里面获取、不用经过后端的Web层和Redis集群;Web层缓存Web层里面会有一些Ehcache缓存、可以使用HashMap、ConcurrentHashMap、ArrayList等数原创 2021-06-23 22:55:17 · 6505 阅读 · 1 评论 -
数据结构与算法-二叉树、二叉搜索树、红黑树
二叉树、二叉搜索树、红黑树树形结构二叉树基于数组实现二叉树;基于链表实现二叉树实现二叉树的层次遍历基于数组实现完全二叉树的遍历二叉搜索树特点二叉搜索树的插入树形结构像现实生活中的树、即不再像链表一样、仅仅是一对一的关系。可以是一对一、一对多的关系;结点:树里面的元素。父子关系:结点之间相连的边子树:当结点大于1时,其余的结点分为的互不相交的集合称为子树度:一个结点拥有的子树数量称为结点的度叶子:度为0的结点孩子:结点的子树的根称为孩子结点兄弟:同一个双亲结点森林:由N个互不相交的树构成原创 2021-06-23 00:00:58 · 493 阅读 · 3 评论 -
数据结构与算法之栈
栈与队列栈栈如何实现栈的分类栈的基本操作栈的应用场景栈比如我们在放盘子的时候都是从下往上一个个放,拿的时候是从上往下一个个的那,不能从中间抽,这种其实就是一个典型的栈型数据结构。后进先出即Last In First Out (LIFO)。栈如何实现它是一个限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其原创 2021-06-12 23:31:43 · 169 阅读 · 4 评论 -
数据结构与算法之队列
队列队列特点队列分类队列基本操作者队列实现方式循环队列队列应用场景队列队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故原创 2021-06-12 23:31:19 · 468 阅读 · 1 评论 -
数据结构与算法-链表
链表链表特点单链表LinkedList与ArrayList数组VS链表循环链表双向链表单项链表实现双向链表实现链表链表通过指针将一组零散的内存块串联在一起。其中,我们把内存块称为链表的“结点”。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址。链表也是线性表;特点不需要连续的内存空间。有指针引用三种最常见的链表结构:单链表、双向链表和循环链表单链表从单链表图中,可以发现,有两个结点是比较特殊的,它们分别是第一个结点和最后一个结点。我们一般把第一原创 2021-06-11 02:45:03 · 1145 阅读 · 0 评论 -
数据结构与算法-数组
数组数组数组定义表现形式数组的随机访问数组下标为什么从0开始?优缺点ArrayList和数组堆栈内存数组实现CRUD数组是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量也称为数组的分量,也称数组元素。区分数组的各个元素的数组编号为下标;数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。这些无序排列的同类数据元素的集合称为数组。线性表数组定义数组是相同数据类型的元素的集合各元素的存储是有先后顺序的,在原创 2021-06-11 00:41:56 · 723 阅读 · 0 评论 -
线程与线程池
线程与线程池线程线程状态四种创建方式协程(非重点)线程池特点线程池架构说明创建线程池Executors.newFixedThreadPool(int)Executors.newSingleThreadPool()Executors.newCachedThreadPool()new ThreadPoolExecutor()线程池 7 大参数线程运行原理线程池拒绝策略单一的、固定的、可变的三种创建线程池的方法,用哪个多?线程线程是CPU调度的基本单位,线程模型分为KLT、ULT模型,JVM使用的KLT,Ja原创 2021-06-09 01:21:17 · 708 阅读 · 1 评论 -
理解HashMap与ConcurrentHashMap
HashMap数据结构源码原理分析HashMap属性HashMap内部类Nodeput()HashMap的负载因子为什么0.75HashMap与HashTable的区别JDK1.7与1.8中,HashMap的区别JDK1.7扩容死锁分析单线程扩容多线程扩容Jdk8-扩容ConcurrentHashMap数据结构JDK1.7并发安全控制重要成员变量put(key,value)get(key)数据结构数组+链表+(红黑树jdk>=8)源码原理分析HashMap属性 //初始容量为16;原创 2021-06-09 00:13:31 · 1027 阅读 · 3 评论 -
深入理解ArrayList与CopyOnWriteList源码
ArrayList与CopyOnWriteListArrayList属性构造方法get()add(E e)问题解决ArrayList线程不安全的方法Collections.synchronizedList(new ArrayList<>())CopyOnWriteList数据结构get(int index)add(E e)HashSetHashSet构造方法add(E e)解决方法CopyOnWriteArraySet构造方法add(E e)contains(Object o)ArrayLis原创 2021-06-08 00:13:32 · 1100 阅读 · 5 评论 -
深入理解Automatic、CAS、Unsafe类
Automatic与Unsafe类Automatic类i++在并发场景下存在的问题三级目录Automatic类原子操作:不可被中断的一个或一系列操作i++在并发场景下存在的问题实例代码:class MyData{ int number=0; public void addPlusPlus(){ number++; } private static void atomicDemo() { System.out.println("原子性测试");原创 2021-06-08 00:13:04 · 1925 阅读 · 4 评论 -
基于Semaphore理解部分AQS源码
Semaphore、CountDownLatch、CyclicBarrierSemaphore代码示例构造方法重要方法Semaphore.acquire()tryAcquireShared(arg)doAcquireSharedInterruptibly()addWaiter(Thread)node.predecessor()shouldParkAfterFailedAcquire(p,node)parkAndCheckInterrupt()Semaphore.release()tryReleaseShar原创 2021-06-07 01:51:28 · 322 阅读 · 1 评论 -
基于ArrayBlockingQueue理解AQS部分源码
ArrayBlockingQueue阻塞队列队列类型阻塞队列的好处阻塞队列分类阻塞队列API生产者消费者ArrayBlockingQueue源码1. new ArrayBlockingQueue()2. put(Object obj)2.1 enqueue(e)2.1.1 notEmpty.signal()2.1.2 doSignal(Node first)2.1.3 transferForSignal(Node node)2.1.4 enq(node)2.2 notFull.await()2.2.1原创 2021-06-06 02:33:34 · 407 阅读 · 0 评论 -
基于ReentrantLock深入理解AQS源码(二)
深入理解AQS示例代码1.new ReentrantLock()2.ReentrantLock.lock()2.1 compareAndSetState(0, 1)3. acquire()4. tryAcquire(arg)5. addWaiter(Thread)5.1 enq(Node node)5.1.1compareAndSetHead6. acquireQueued(Node node, arg)6.1 Node.predecessor()6.2 shouldParkAfterFailedAcqu原创 2021-06-05 23:58:29 · 725 阅读 · 0 评论 -
基于ReentrantLock深入理解AQS数据结构
AQSLockSupport、Synchronized、ConditionLockSupport阻塞方法park唤醒方法unparkLockSupport解决的问题AQSAQS具备特性AQS数据结构同步等待队列条件等待队列AQS数据结构源码ReentrantLock开始解读AQSLockSupport、Synchronized、Conditionjava中3种让线程等待唤醒的方法:使用Object的wait()让线程等待,使用Object中的notify方法唤醒线程;使用JUC中COndit原创 2021-06-05 23:58:03 · 557 阅读 · 1 评论 -
公平锁、非公平锁、可重入锁、自旋锁、读写锁
并发编程多种锁公平锁与非公平锁公平锁和非公平锁的区别synchronized与ReentrantLock的区别可重入锁代码示例自旋锁自旋锁代码示例独占锁(写锁)、共享锁(读锁)、互斥锁ReentrantReadWriteLock源码公平锁与非公平锁公平锁指多个线程按照申请锁的顺序来获取锁,按照先来先服务的原则。其落地实现可使用队列。非公平锁多个线程获取锁的方式不是按照申请锁的顺序,后申请锁的线程可以比先申请锁的线程先获得锁。JUC下的ReentrantLock的构造boolean值参原创 2021-06-05 15:41:31 · 2570 阅读 · 0 评论 -
深入理解Synchronized关键字
Synchronized同步器的意义如何解决线程并发安全问题synchronized原理详解synchronized底层原理Monitor监视器锁什么是monitor?ObjectMonitor对象记录锁状态对象头锁的膨胀升级过程偏向锁轻量级锁自旋锁锁消除同步器的意义临界资源:多个线程同时访问同一个共享,可变的资源;临界资源可以是对象,变量,文件等;引出的问题:多个线程对共享资源的读写,写写问题如何解决线程并发安全问题实际上,所有并发模式在解决线程安全问题时,都是采用序列化访问临界资源。即同原创 2021-06-05 01:34:20 · 677 阅读 · 1 评论 -
深入理解volatile与MESI缓存一致性协议
volatile与MESI缓存一致性协议volatile实例多级缓存结构总线锁多核CPU多级缓存一致性协议MESIMESI协议缓存状态MESI状态转换MESI状态切换举例MESI优化和引入的问题CPU切换状态阻塞解决存储缓存(Store Bufferes)Store Bufferesstore buffer过程图MESI失效volatilevolatile是Java虚拟机提供的轻量级的同步机制。不能保证原子性保证volatile修饰的共享变量对所有线程是可见的。也就是当一个线程修改 了一个被vo原创 2021-06-04 01:57:18 · 1851 阅读 · 0 评论 -
数据结构与算法-选择排序与堆排序
选择排序与堆排序选择排序选择排序思想选择排序思路分析图实现堆排序大顶推小顶堆堆排序的思想堆排序步骤图解说明构造初始堆基本思路选择排序选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到 排序的目的。选择排序思想选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从 arr[0]~arr[n-1]中选取最小值, 与 arr[0]交换,第二次从 arr[1]~arr[n-1]中选取最小值,与 arr[1]交换,第三次从 arr原创 2021-06-03 16:28:10 · 153 阅读 · 0 评论 -
数据结构与算法-归并排序与基数排序
归并排序与基数排序归并排序基本思想示意图归并排序思想示意图 2应用实例基数排序基数排序基本思想基数排序图文说明代码实现基数排序的说明每个人的实现都有不同,重要是掌握其思想。归并排序归并排序(MERGE-SORT)是利用归并思想实现的排序方法,该算法采用经典的分治(divide-and-conquer) 策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修 补"在一起,即分而治之)。基本思想示意图归并排序思想示意图 2合并相邻有原创 2021-06-03 15:59:06 · 478 阅读 · 1 评论 -
JMM模型与volatile详解(一)
JMM模型与volatile详解JMM模型JMM不同于JVM内存区域模型JMM模型图主内存工作内存Java内存模型与硬件内存架构的关系JMM存在的必要性数据同步八大原子操作同步规则分析JMM的可见性、原子性,有序性原子性可见性有序性JMM如何解决原子性&可见性&有序性问题原子性问题可见性问题有序性问题as-if-serialhappens-before 原则volatile关键字volatile的可见性示例不能保证原子性禁止指令重排JMM模型Java内存模型(Java Memory Mo原创 2021-06-03 02:23:29 · 501 阅读 · 1 评论 -
JMM模型与volatile详解(二)
volatile内存屏障volatile禁止指令重排的原因硬件层的内存屏障volatile内存语义的实现实现volatile的内存语义volatile写插入内存屏障后生成的指令序列示意图volatile读插入内存屏障后生成的指令序列示意图volatilevolatile是Java虚拟机提供的轻量级的同步机制。不能保证原子性保证volatile修饰的共享变量对所有线程是可见的。也就是当一个线程修改 了一个被volatile修饰共享变量的值,新值总是可以被其他线程立即得知。禁止指令重排序禁止指令原创 2021-06-03 02:20:26 · 371 阅读 · 0 评论 -
数据结构与算法-冒泡排序与快速排序
冒泡排序与快速排序冒泡排序思想优化冒泡过程的例子应用实例快速排序举例挖坑填坑法实现代码冒泡排序思想基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较 相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。优化因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在 排序过程中设置一个标志 flag 判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排 序写好后,在进行)冒原创 2021-06-02 19:13:04 · 278 阅读 · 0 评论 -
数据结构与算法-插入排序与希尔排序
插入排序与希尔排序插入排序插入排序法思想插入排序思路图插入排序法应用实例希尔排序插入排序存在的问题希尔排序法介绍希尔排序法基本思想希尔排序法的示意图希尔排序法举例每个人的算法实现可能不同,但是一定要掌握其排序思想。冒泡,选择,插入是程序员必须会手写的普通算法。插入排序插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。插入排序法思想插入排序(Insertion Sorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有 序原创 2021-06-01 20:34:43 · 571 阅读 · 1 评论 -
搭建网站框架踩到的坑之获取ServletPath
路径问题RealPathServletPathContextPathRequestURI获取真实ServletPath的方法RealPathString realPath=request.getServletContext().getRealPath();String realPath=request.getServletContext().getRealPath("XXX");1)取得服务应用的绝对路径(本地路径)。2)取得服务应用的绝对路径,再和参数进行拼接。(在应用绝对路径下创建一个目录,原创 2021-06-01 16:56:33 · 1576 阅读 · 2 评论 -
设计模式之原型模式与深浅拷贝
原型模式原型模式背景克隆问题改进代码应用场景浅拷贝深拷贝注意事项与细节原型模式背景克隆问题类似过程://原始对象User user=new User();user.setName("...");//...对象属性的操作;//如果需要克隆三个对象;User user1=new User();user1.setName(user.getName());//...user1设置属性User user2=new User();user2.setName(user.getName())原创 2021-05-28 01:35:46 · 485 阅读 · 1 评论 -
单例模式及其8种实现方式
单例模式概述8种实现方式具体代码实现1. 饿汉式(静态常量)(推荐使用)写法安全的原因2.饿汉式(静态代码块)(推荐使用)3. 懒汉式(线程不安全)优缺点说明:懒汉式(线程安全,同步方法)优缺点说明:懒汉式(线程安全,同步代码块)优缺点说明双重检查(双端检索)优缺点说明静态内部类(推荐使用)优缺点说明枚举 (推荐使用)优缺点说明总结概述单例模式是 Java 中最简单,也是最基础,最常用的设计模式之一。8种实现方式饿汉式(静态常量)(√)饿汉式(静态代码块)(√)懒汉式(线程不安全)懒汉式(原创 2021-05-27 02:29:06 · 673 阅读 · 0 评论 -
深入理解MySQL隔离级别与锁机制
MySQL隔离级别与锁机制概述事务并发事务处理带来的问题事务隔离级别锁详解锁分类表锁基本操作行锁总结行锁与事务隔离级别案例分析读未提交读已提交可重复读串行化间隙锁(Gap Lock)临键锁(Next-key Locks)无索引行锁会升级为表锁结论行锁分析查看系统库锁相关数据表死锁锁优化建议概述数据库一般都会并发执行多个事务,多个事务可能会并发对相同的一批数据进行CRUD操作,可能会出现读写、写写并发进行,需要进行同步,否则会出现更新丢失,脏读,不可重复读,幻读问题;本质就是多个事务并发问题,数据库为了原创 2021-05-26 22:46:55 · 1213 阅读 · 3 评论 -
MySQL索引优化实战
MySQL索引优化实战二分页查询优化limit分页查询分页场景优化技巧场景1:自增且主键排序缺点根据非主键字段排序的分页查询JOIN关联查询优化mysql的表关联常见有两种算法嵌套循环连接(Nested-Loop Join算法)算法sql的大致流程基于块的嵌套循环连接算法(Block Nested-Loop Join)sql的大致流程两种算法比较对于关联sql的优化对于小表的定义in和exsits优化count(*)查询优化常见优化方法阿里巴巴Mysql规范解读数值类型优化建议日期和时间优化建议字符串优化建原创 2021-05-25 21:59:47 · 249 阅读 · 0 评论 -
SQL语句的执行
SQL语句的执行MySQL的内部组件结构Server层Store层连接器长连接与短连接查询缓存大多数情况查询缓存就是个鸡肋,为什么呢?使用场景分析器词法分析器原理优化器执行器bin-log归档1. 配置my.cnf2. binlog命令3. 查看binlog内容4. 数据归档操作归档测试MySQL的内部组件结构大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。Server层主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函原创 2021-05-25 13:26:34 · 775 阅读 · 0 评论 -
JVM执行引擎
JVM执行引擎JVM执行引擎Java代码编译和执行过程Java代码编译是由Java源码编译器来完成的Java字节码的执行是由JVM执行引擎来完成的什么是解释器?什么是JIT编译器?为什么说Java是半解释半编译性语言解释器现状JIT编译器解释器依然存在的必要性Hotspot JVM的执行方式编译器的概念热点代码及探测方式方法调用计数器热度衰减回边计数器HotSpotVM可以设置程序执行方式JVM执行引擎1)执行引擎是java虚拟机的核心组成部分之一3)JVM的主要任务是:负责装载字节码带其内部。 但字原创 2021-05-18 11:56:16 · 292 阅读 · 1 评论