- 博客(19)
- 收藏
- 关注
原创 JAVA NIO入门
目录三大组件简介Channel(通道)Buffer(缓冲区)Buffer常见方法Selector(选择器)处理Accept事件处理read事件处理write事件零拷贝传统的IONIO的优化NIO进一步优化NIO再进一步优化三大组件简介Channel,Buffer,SelectorChannel(通道)有点类似于Stream。不过与Stream的单向通道不同,它是可以读写的双向通道。常见的 Channel 有FileChannelDatagramChannelSocketChannelSe
2021-04-07 14:15:56
243
原创 说说JUC三个类:CountDownLatch,CyclicBarrier和Semaphore
目录CountDownLatchCyclicBarrierSemaphore总结在JUC中,有三个工具类来辅助我们进行并发编程,分别是CountDownLatch,CyclicBarrier和SemaphoreCountDownLatch英文意味倒计时器。顾名思义,它能够让某个线程等待,直到倒计时结束再执行。假如我想让主线程最后执行。看如下代码(未加CountDownLatch):public class CountDownLatchTest { public static void m
2021-03-27 20:46:58
279
原创 垃圾回收算法详谈
目录分代收集理论标记-清除算法标记-复制算法标记-整理算法分代收集理论现在大多数的经典垃圾收集器,都遵循分代垃圾回收,就是将内存分为新生代和旧生代进行分代收回。这样的设计是建立在三种假说上弱分代假说:绝大数的对象都是朝生夕灭的强分代假说:熬过越多次的垃圾收集过程的对象就越难消亡跨代引用假说:跨代引用相对于同代引用来说仅占极少数根据前两条的假说,就不难理解分代垃圾设计的原因。如果一个区域的对象都是朝生夕灭的话,那么把他们集中在一起,每次都关注如何保留少量的存活对象而不是去标记那些要消亡的对象,就能
2021-03-05 16:22:03
159
原创 java线程的实现
目录前言内核线程实现用户线程实现混合实现java线程实现前言目前来说,线程是java语言进行处理器资源调度的最小单位。一般来说,以一个通用应用的角度来看,实现线程有三种方式。使用内核实现(1:1实现),使用用户线程实现(1:n实现),使用用户线程加轻量级进程实现(n:m实现)内核线程实现内核线程(Kernel-Level Thread,KLT)就是操作系统内核直接操作的线程。每个内核线程都可以视为内核的分身,这样一个操作系统就有了同时处理多任务的能力。而程序一般不会直接使用内核线程。而是使用内核线
2021-03-05 16:15:22
170
原创 浅谈JVM的垃圾回收
JVM的垃圾回收算法和垃圾收集器前言JVM内存分布图如何确定垃圾JVM垃圾回收算法垃圾收集器前言算法是理论,垃圾收集器是理论的实现。常用的垃圾回收算法有4个,分别是引用计数算法,复制算法,标记清除算法和标记整理算法。垃圾收集器常用的有9个。分别是新生代(3):Serial,PerNew,Parrel ,老生代(3):Serial Old,PerNew Old,CM以及G1。在这之前,需要先了解下JVM的内存分布图JVM内存分布图以JDK1.8为例,JVM的内存分布主要是堆,栈和元空间。栈主
2021-02-18 17:39:07
280
原创 由ReentrantLock的lock和unlock来讲讲AQS(下)
从ReentranLock的unlock方法讲讲AQSreleaseunlock是释放锁的方法,源码如下 public void unlock() { sync.release(1); }同样的,release方法也是AQS里的,它的源码: public final boolean release(int arg) { if (tryRelease(arg)) { //head指向的节点,就是头结点,也就是那个空线程的节
2020-11-26 10:59:00
177
原创 由ReentrantLock的lock和unlock来讲讲AQS(上)
AQS的几个重要元素先来说说AQS的几个重要元素1:state变量 /** * The synchronization state. */ private volatile int state;这个是一个volatile修饰的int类型的变量,代表同步的状态。在AQS的内部,有许多cas操作的来修改这个state,并根据操作的成功与否进行后续的步骤2:CLH队列AQS作为JUC基石之一,在ReentrantLock里被广泛调用。ReentrantLock是在A
2020-11-26 10:58:42
274
原创 面试官:说说java类的加载机制
前言java语言之所以能够编译一次,到处运行,字节码文件功不可没。字节码文件是将java代码编译后得到。编译好的字节码文件需要通过JVM加载到内存,最终才能与CPU进行交流,java程序才能被执行起来。JVM把描述类的数据从字节码文件加载到内存里,并对数据进行校验,解析转化和初始化,最新形成可以被虚拟机直接使用的Java类型,这个过程被称为虚拟机的类加载机制。一个类从被加载到虚拟机内存中开始,到卸载出内存为止,会经过加载,验证,准备,解析,初始化,使用,卸载共七个阶段。其中验证,准备,解析又被称为连接。
2020-11-15 13:00:10
237
原创 java的四种类型的引用
前言判断对象是否存活都与引用抛不开关系。而JDK1.2前的引用是很传统的意思。就比如某个数据中存储的值代表的是另一块内存的地址值,那么就说这个数据代表的是某个内存某个对象的引用。这种概念在某些情况下有点狭隘了。因为这种只代表了引用和非引用两种情况,而对于有些对象,留着没什么关系,丢了也不可惜,内存足够时我留着,内存不足时我丢弃,这样情况下的对象,这种引用的概念没法很好的描述。对此,在JDK1.2后,对引用进行了扩充,分别为:强引用(Strongly Reference)软引用(Soft Referen
2020-11-14 13:15:32
110
原创 面试官:现在来考考你几道非常非常常见的Redis题目
这里写目录标题Redis为什么快Redis的数据类型Redis的过期策略和内存淘汰机制缓存数据双写一致性Redis为什么快1:基于内存操作2:单线程,没有多线程的上下文切换的开销3:高效的数据结构4:多路复用io机制Redis的数据类型1:String类型最常用数据类型。这个是二进制安全。什么是二进制安全,简单来说就是能够将输入作为原始的,无任何特殊格式意义的数据流,这意味着redis的string类型可以存储数据,包括图片等等。如果存储是数字,那么就行进行增加减少等操作。String常用
2020-11-09 13:40:09
133
原创 访问一个url的全过程
访问一个url的全过程前言过程DNS解析具体过程建立TCP连接TCP报文格式三次握手浏览器发送Http请求Http报文格式服务器返回Http响应浏览器根据响应进行解析渲染,呈现给用户浏览器关闭TCP连接Connection: keep-alive四次挥手关闭TCP连接前言当我们在浏览器上键入www.baidu.com,并按下回车时,发生了哪些事?过程大致有这几个流程1:DNS解析,得到IP地址2:浏览器根据IP地址,访问服务器,建立TCP连接3:建立完TCP连接后,浏览器向服务器发送http请
2020-10-31 18:07:10
3750
原创 说说synchronized锁升级过程
前言随着JDK的不断迭代,synchronized锁的性能得到了极大的提升,它早已经不是以前那把笨重的锁了。在JDK1.6前,synchronized只是一把重量级的锁,而jdk1.6后,实现了偏向锁,轻量锁等,引入锁升级的机制,使得synchronized更加高效,性能更好,现在就来讲讲synchronized升级的过程。对象头首先我们要先知道什么是对象头,因为synchronized锁信息是存放在对象头的。一个对象是由对象头,实例数据,填充字节组成。对象头包括:1 Mark Work。记录着
2020-10-24 12:35:30
1526
原创 面试官:说说分布式事务的解决方案
前言如果项目使用的分布式的架构,那么分布式事务永远是需要面对的问题。由于不同的业务场景对数据一致性的要求不一样,那么就出现不同的解决方案。CAP由于分布式事务是用来解决分布式数据一致性的问题,因此在这之前,需要先知道一个描述分布式系统设计的理论–CAP理论。CAP:C:Consistency 一致性,指的是多个节点环境下的数据是否强一致性。A:Availability 可用性,指的是分布式服务能够一致保证可用的状态P:Partition Tolerance分区容错性,指的是对网络分区的容忍性
2020-10-19 11:29:23
396
原创 说说redis持久化的两种机制:RDB和AOF
前言redis有两种持久化机制,分别是AOF和RDB,现在就来说说两者的特点RDB的原理两个关键点:fork 和 writefork:redis会单独创建(fork)一个和原进程一模一样的子进程来进行持久化。write:这个进程会先将数据写入一个临时文件里,待持久化结束了再用这个文件替换上次持久化的文件RDB什么时候触发呢1:shutdown的时候,就是正常退出redis2:redis.conf配置文件默认的快照配置,如下save 900 1save 300 10save 60 100
2020-10-08 13:06:48
222
原创 分布式锁实现原理三两谈
抛砖引玉假设有个秒杀活动,秒杀手机50台。现在把手机台数放在redis缓存里,然后秒杀成功一次,库存减一,库存没了就告诉用户秒杀失败看下面这段伪代码 String productName = "iphone11"; Integer num = Integer.parseInt( stringRedisTemplate.opsForValue().get(productName)); if(num > 0){ int realNu
2020-10-07 16:12:18
202
原创 线程池两三讲
浅谈线程池前言线程池七大参数详解线程池工作原理线程池拒绝策略线程池的常用队列前言合理的多线程编程能够充分的利用CPU,内存,IO,网络等资源。但是在阿里巴巴开发手册里提到不能显示的创建线程,就是new Thread。这是因为创建和销毁线程需要一定的开销。在很多情况下,创建和销毁线程加起来的时间要大于使用线程的时间。如果大量的创建和销毁线程,将会造成巨大的系统资源浪费。线程池技术因此诞生。利用线程池,将很好的管理并复用线程,极大的节约了系统资源。但是,阿里巴巴开发手册又明确要求不能使用官方提供的四种线
2020-10-05 14:06:27
196
原创 说说关键字volatile
volatile关键字详讲1可见性什么是JMMvolatiele关键字的作用有两个:1:保证变量的可见性2:禁止指令重排1可见性什么叫做可见性,这里需要先说下java内存模型(JMM)什么是JMM先来看一张图
2020-10-03 14:57:53
240
原创 说说HashMap的扩容机制
首先先看下HashMap几个重要的常量static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; 默认初始化值16在创建HashMap时,如果没有指定具体的值,初始化默认是16static final int MAXIMUM_CAPACITY = 1 << 30最大容量,即HashMap能创建的最大容量static final float DEFAULT_LOAD_FACTOR = 0.75f;负载因子,HashMap的
2020-10-02 14:04:42
4082
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人