
Java
文章平均质量分 84
K. Bob
多读书,多睡觉;少吃零食,多运动。
展开
-
Netty
目录Netty线程模型1. 单线程模型2. 多线程模型3. 主从多线程模型Netty线程模型 Netty通过Reactor模型基于多路复用器接收并处理用户请求,内部实现了两个线程池,boss线程池和work线程池,其中boss线程池的线程负责处理请求的accept事件,当接收到accept事件的请求时,把对应的socket封装到一个NioSocketChannel中,并交给work线程池,其中work线程池负责请求的read和write事件,由对应的Handler处理。1. 单线程模型 所有I/原创 2021-09-04 17:44:07 · 172 阅读 · 0 评论 -
Java疑难杂问③
public class MaxHeap<E extends Comparable<E>> { private Array<E> data;//维护一个自定义数组 public MaxHeap(int capacity) { data =new Array<>(capacity); } public MaxHeap() { data=...原创 2020-04-24 00:54:02 · 253 阅读 · 0 评论 -
Spring
目录SpringIOC理论Spring配置依赖注入bean的自动装配使用注解开发使用Java的方式配置Spring代理模式AOP声明式事务Spring Spring是一个开源的免费的框架(容器),Spring是一个轻量级的、非入侵式的控制反转(IOC)和面向切面编程(AOP)的框架,Spring支持事务的处理,对框架整合的支持。核心容器(Spring Core) 核心容器提供Spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用B原创 2021-04-13 21:56:09 · 293 阅读 · 0 评论 -
Spring Boot
目录SpringBoot的介绍Spring和SpringBoot比较Spring Boot的配置加载顺序Spring boot 的配置文件Spring Boot 的核心注解SpringBoot的介绍 Spring框架为开发Java应用程序提供了全面的基础架构支持。它包含如依赖注入和开箱即用的模块,这些模块可以大大缩短应用程序的开发时间。例如,在Java Web开发的早期阶段,需要编写大量的重复代码来将记录插入到数据源中。但是通过使用Spring JDBC模块的JDBCTemplate,我们可以将它简化原创 2021-02-25 23:21:40 · 269 阅读 · 0 评论 -
Spring Bean的生命周期
顺丰科技,贝壳找房,菜鸟网络,快手科技,京东,网易云,一点资讯,有赞,VIPKID,小米,腾讯pcg后端,跟谁学,滴滴,美团,58转转,美的,哔哩哔哩。拼多多,欢聚,搜狗,映客直播,携程,柠檬微趣,老虎证券,科大讯飞,爱奇艺,携程,4399,小红书等等好多。猿辅导,百度,作业帮,好未来,搜狐,海康威视等等。网易雷火,网易游戏,虎牙,斗鱼,搜狐畅游,触宝,用友,度小满金融等。...原创 2020-11-17 21:51:19 · 1958 阅读 · 0 评论 -
三色标记法
垃圾回收算法包括:标记-清除、标记-复制、标记-整理。在此基础上可以增加分代(新生代/老年代),每代采取不同的回收算法,以提高整体的分配和回收效率。无论使用哪种算法,标记总是必要的一步。垃圾回收器的工作流程大体如下:标记出哪些对象是存活的,哪些是垃圾(可回收)进行回收(清除/复制/整理),如果有移动过对象(复制/整理),还需要更新引用三色标记法基本算法要找出存活对象,根据可达性分析,从GC Roots开始进行遍历访问,可达的则为存活对象。将遍历对象图过程中遇到的对象,按“是否访问过”这个条原创 2020-10-16 13:34:07 · 1973 阅读 · 0 评论 -
位图与Bloom过滤器
位图 位图常用在给定一个很大范围的数,判断某个数是否在其中。BitSet是位操作的对象,值只有0或1(即true 和 false),内部维护一个long数组,初始化只有一个long segement,所以BitSet最小的size是64;随着存储的元素越来越多,BitSet内部会自动扩充,一次扩充64位,最终内部是由N个long segement 来存储。默认情况下,BitSet所有位都是0即false;基本原理是,用1位来表示一个数据是否出现过,0为没有出现过,1表示出现过。使用用的时候既可根据某一个原创 2020-09-15 23:02:50 · 273 阅读 · 0 评论 -
Java疑难杂问②
配置成功的那一刻感觉很美好问题的分析过程及解决问题的分析过程及解决这几天学习spark集群,需要用到zk,但是我配置集群的时候,在执行./zkServer.sh startjps命令没有问题但是./zkServer.sh status时会出现:Error contacting service. It is probably not running查看bin下的zookeeper.o...原创 2019-04-20 17:12:25 · 2561 阅读 · 0 评论 -
Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
目录CountDownLatchCyclicBarrierSemaphore怎么保证多线程都结束了再进行下一步处理?可以使用countdownlatch、cyclicbarrier或者semaphore。继续往下可以串联出底层的原理,AQS等等。CountDownLatch CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这原创 2020-07-18 09:03:41 · 279 阅读 · 0 评论 -
ReentrantLock源码分析
朋友可以尝试以下步骤:1、vi ifcfg-eth0 查看网卡配置2、DEVICE=eth0HWADDR=00:0c:29:4B:6F:93TYPE=EthernetUUID=c057f190-154f-4d2c-bad0-305f28fbd55dONBOOT=yesNM_CONTROLLED=yesBOOTPROTO=dhcpDNS1=8.8.8.8加入DNS1=8.8....原创 2019-04-10 13:56:45 · 2098 阅读 · 0 评论 -
对象/类生命周期
TCP客户端:1.建立连接套接字,设置Ip和端口监听,socket()2.建立连接 connect3.write() 获取网络流对象 发送数据4.read()获取网络流对象 接收数据5.关闭套接字TCP服务器端1.建立端口监听 socket()2.绑定指定端口 bind()3.listen 进行端口监听4.accept() 阻塞式 直到有客户端访问5.read()获取客户端发...原创 2020-06-23 20:23:17 · 924 阅读 · 0 评论 -
ThreadLocal
目录ThreadLocalThreadLocalMapThreadLocalMap 核心方法ThreadLocalMap的内存泄漏问题应用ThreadLocal ThreadLocal是线程的一个本地化对象。当工作于多线程中的对象使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程分配一个独立的变量副本。所以每一个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。从线程的角度看,这个变量就像是线程的本地变量。 提供了set和get方法来访问拷贝过来的变量原创 2020-06-12 16:18:16 · 490 阅读 · 0 评论 -
Spring IOC/AOP
Spring AOP的底层实现 Spring AOP 面向切面编程 Aspect Oriented Programming(适用于权限检查,日志记录,性能分析,事务管理,异常管理) 。Spring AOP使用了两种代理机制,一种是基于JDK的动态代理,另一种是基于CGLib的动态代理。基于JDK的动态代理 JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中 InvocationHandler是一个接口,可以通过实现该接口定原创 2020-06-03 11:16:23 · 358 阅读 · 0 评论 -
守护进程/僵尸进程/孤儿进程
目录孤儿进程与僵尸进程守护进程孤儿进程与僵尸进程 在Linux当中,子进程是由父进程创建的,子进程再创建新的进程。子进程的结束和父进程的运行是一个异步的过程,即父进程永远无法预测子进程到底什么时候结束。unix系统提供了一种机制可以让父进程获得子进程结束时的状态信息,也就是说在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存,但是仍然为其保留一定的信息,如进程号,退出状态,运行时间等。那么,当一个子进程完成它的工作终止之后,它的父进程就要调用wait()或者waitpid()系原创 2020-06-01 15:02:16 · 383 阅读 · 0 评论 -
AQS
AQS(AbstractQuenedSynchronizer抽象的队列式同步器)在java.util.concurrent.locks包,自旋锁、互斥锁、读锁写锁、条件产量、信号量、栅栏都是AQS的衍生物。AQS的核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程并将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。 CLH队列是一个虚拟的双原创 2020-05-31 23:39:25 · 305 阅读 · 0 评论 -
Java疑难杂问①
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。 Java 的泛型是伪泛型, 运行期的泛型类型,被擦除了,因此,在运行期,ArrayList< String> 和 ArrayList< Integer> 是相同的类型。JVM并不知道泛型的存在,因为泛型在编原创 2020-05-30 10:39:47 · 664 阅读 · 0 评论 -
BIO和NIO | Reactor
目录基本概念BIO(同步阻塞)NIO(同步非阻塞)AIO(异步非阻塞)总结基本概念同步:使用同步IO时,Java自己处理IO读写异步:使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS,完成后OS通知Java处理(回调)阻塞:使用阻塞IO时,Java调用会一直阻塞到读写完成才返回非阻塞:使用非阻塞IO时,如果不能立马读写,Java调用会马上返回,当IO事件分发器通知可读写时在进行读写,不断循环直到读写完成BIO(同步阻塞) 服务器的实现模式是一个连接一个线程原创 2020-05-24 10:10:59 · 351 阅读 · 0 评论 -
Java内存模型
目录java内存模型主内存与工作内存内存间交互操作重排序先行发生原则并发内存模型的实质原子性(Automicity)可见性有序性java内存模型 java内存模型(Java Memory Model,JMM)是java虚拟机规范定义的,用来屏蔽掉java程序在各种不同的硬件和操作系统对内存的访问的差异,这样就可以实现java程序在各种不同的平台上都能达到内存访问的一致性。主内存与工作内存 Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样原创 2020-05-19 22:43:36 · 289 阅读 · 0 评论 -
读写锁
目录ReentrantReadWriteLock分析特性源码分析构造方法Sync分析获取锁读锁的获取写锁的获取总结释放锁读锁的释放写锁的释放总结总结 ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁。读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的。所有读写锁的实现必须确保写操作对读操作的内存影响。换句话说,一个获得了读锁的线程必须能看到前一个释放的写锁所更新的内容。 读写锁比互斥锁允许对于共享数据更大程度的并发。每次只能有一个写线程,但是同时可以有多个线程并发地读数据。Re原创 2020-05-19 19:33:27 · 278 阅读 · 0 评论 -
零拷贝
目录零拷贝的概念传统I/O通过sendfile实现的零拷贝I/O带有DMA收集拷贝功能的sendfile实现的I/O通过mmap实现的零拷贝I/OJava的实现NIO的零拷贝NIO的直接内存NIO DirectByteBuffer零拷贝的概念 零拷贝是CPU不执行拷贝数据从一个存储区域到另一个存储区域的任务,这通常用于通过网络传输一个文件时以减少CPU周期和内存带宽。零拷贝是操作系统底层的一种实现,在网络编程中,利用操作系统这一特性,可以大大提高数据传输的效率。零拷贝的好处减少甚至完全避免不必要原创 2020-05-15 14:03:44 · 267 阅读 · 0 评论 -
内部类/静态内部类/局部类/匿名内部类
内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。内部类主要有一下几种:成员内部类、局部内部类、静态内部类、匿名内部类。内部类的共性:内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名...原创 2020-05-03 20:16:34 · 420 阅读 · 0 评论 -
JDK1.8 新特性
jdk1.8新特性知识点:Lambda表达式函数式接口*方法引用和构造器调用Stream API接口中的默认方法和静态方法新时间日期API在jdk1.8中对HashMap等map集合的数据结构优化。HashMap数据结构的优化:原来的HashMap采用的数据结构是哈希表(数组+链表),在1.8之后,在数组+链表+红黑树来实现HashMap,1.8之后链表新进元素加到末尾,1.8之...原创 2020-04-29 10:41:42 · 281 阅读 · 0 评论 -
JVM OOM
JVM内存溢出分为两种情况:OutOfMemoryError和StackOverflowErrorOutOfMemoryError是在程序无法申请到足够的内存的时候抛出的异常StackOverflowError是线程申请的栈深度大于虚拟机所允许的深度所抛出的异常java.lang.OutOfMemoryError:Java heap space 堆内存溢出解决办法:设置堆内存大小,设置...原创 2020-04-26 21:44:22 · 299 阅读 · 0 评论 -
工厂模式
工厂模式是用工厂方法代替new操作的一种模式。工厂模式方便创建同种产品类型的复杂参数对象。工厂模式重点就是适用于 构建同产品类型(同一个接口基类)的不同对象时,这些对象new很复杂,需要很多的参数,而这些参数中大部分都是固定的。简单(静态)工厂抽象一个面条基类,(接口也可以),这是产品的抽象类。public abstract class INoodles { /** * 描...原创 2020-04-26 17:41:30 · 207 阅读 · 0 评论 -
GC时间过长优化方法
应用运行过程中是不希望出现长时间的GC停顿的,因为这会影响服务的可用性,导致用户体验变差,甚至会严重损害一些关键的应用程序。本文将会列出可能导致GC停顿时间长的一些原因和解决方案。对象创建的速度过高 如果应用创建对象的速度非常高,随之而来的就是GC频率也会变快,然后会导致GC的停顿时间变长。所以说,优化代码以降低对象的创建速率是降低GC停顿时间最有效的方法。可以使用JProfiler, ...原创 2020-04-25 15:38:36 · 7570 阅读 · 0 评论 -
==和equals
==和equals 对于== ,比较的两个对象的内存空间的地址,如果相等,则说明这两个引用实际是指向同一个对象地址的。值类型是存储在内存中的栈中,而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。 如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址。 对于基本数据类型(byte,shor...原创 2020-04-22 09:59:02 · 216 阅读 · 0 评论 -
引用传递与值传递
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。 JAVA中只有值传递,没有引用传递。地址值也是值,传递地址值不一定就是引用传递。值传递和引用传...原创 2020-04-19 15:37:48 · 221 阅读 · 0 评论 -
死锁
死锁概念在Java中使用多线程,就会有可能导致死锁问题。死锁会让程序一直卡住,不再程序往下执行。只能通过中止并重启的方式来让程序重新执行。死锁成因当前线程拥有其他线程需要的资源当前线程等待其他线程已拥有的资源都不放弃自己拥有的资源死锁场景3.1锁顺序死锁线程是交错执行的,那么就很有可能出现以下的情况:线程A调用 MyThread ()方法,得到o1锁同时线程B调用 MyTh...原创 2020-04-19 00:59:43 · 507 阅读 · 0 评论 -
List与Set
ListList继承了Collection,是有序的列表。可以允许重复的对象可以插入多个null元素是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序常用的实现类有 ArrayList、LinkedList 和 Vector。①ArrayList是基于数组实现的,是一个数组队列。可以动态的增加容量②LinkedList是基于链表实现的,是一个双向循环列表。可以被当...原创 2020-04-17 23:15:13 · 206 阅读 · 0 评论 -
java类的四大基本特性
面向对象的特性:抽象,封装,继承,多态。抽象 抽象类:包含抽象方法的类称之为抽象类,但不意味着抽象类中只能有抽象方法,它和普通类一样,可以拥有普通的成员变量、方法。抽象类不能被实例化。抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方...原创 2020-04-16 23:30:25 · 1981 阅读 · 0 评论 -
线程/进程通信方式
进程间的通信方式管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有血缘关系的进程间使用。进程的血缘关系通常指父子进程关系命名管道(named pipe):命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间通信信号量(semophore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它通常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也...原创 2020-04-15 16:56:35 · 672 阅读 · 0 评论 -
HashMap疑难杂问
HashMap到底是插入链表头部还是尾部在jdk1.8之前是插入头部的,在jdk1.8中是插入尾部的。分析链表插入的位置,重点是分析HashMap的put方法。jdk1.6put方法的代码如下:public V put(K key, V value) { if (key == null) return putForNullKey(value); in...原创 2020-04-12 00:00:24 · 363 阅读 · 0 评论 -
设计模式详解
设计模式(Design pattern)是一套被反复使用、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式的三个分类创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式:把类或对象结合在一起形成一个更大的结构,共七种:适配器模式、装...原创 2020-02-20 21:48:51 · 361 阅读 · 0 评论 -
String不变性以及String/StringBuffer/StringBuilder的区别
String/StringBuffer/StringBuilder的区别String、StringBuffer、StringBuilder都是final 类, 都不允许被继承String 长度是不可变的, StringBuffer、StringBuilder 长度是可变的StringBuffer 是线程安全的, StringBuilder 不是线程安全的,但它们两个中的所有方法都是相同的,...原创 2020-02-16 13:58:47 · 1472 阅读 · 0 评论 -
CAS原理
CAS(Compare and Swap), 比较并交换。 CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。CAS原理可用如下图流程表示:基于jdk1.8.0_20源码分析private static final Unsafe unsafe = Unsafe.getUnsafe();private s...原创 2020-02-12 14:52:21 · 300 阅读 · 0 评论 -
ConcurrentHashMap 1.7/1.8比较
ConcurrentHashMapJDK7中的实现1.1 设计思路1.2 并发度(Concurrency Level)1.3 创建分段锁1.4 put/putIfAbsent/putAll1.5 rehash1.6 remove1.7 get与containsKey1.8 size、containsValueJDK8中的实现2.1 重要的类2.2.1 Node2.2.2 TreeNode2.2.3...原创 2020-02-10 17:56:10 · 574 阅读 · 0 评论 -
阻塞队列
阻塞队列首先是一个队列,当队列是空的时候,从队列获取元素的操作将会被阻塞,当队列是满的时候,从队列插入元素的操作将会被阻塞。消息中间件底层用的就是阻塞队列。BlockingQueue是个接口,实际上用到的并发队列是BlockingQueue的各种实现。BlockingQueue继承自Queue,满足先进先出。public interface BlockingQueue< E>...原创 2020-02-10 14:48:42 · 257 阅读 · 0 评论 -
volatile关键字
volatile volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。volatile原理 volatile可以保证线程可见性且提供了一定的有序性,但是无法保证原子性...原创 2020-02-09 16:40:34 · 323 阅读 · 0 评论 -
Synchronized
在 Java 中,关键字 synchronized可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作),同时我们还应该注意到synchronized另外一个重要的作用,synchronized可保证一个线程的变化(主要是共享数据的变化)被其他线程所看到(保证可见性,完全可以替代Volatile功能),这点确实也是很重要的。synchron...原创 2020-02-08 17:15:23 · 346 阅读 · 0 评论 -
单例模式
java中单例模式是一种常见的设计模式。单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中...原创 2020-02-07 21:46:19 · 236 阅读 · 0 评论