
java基础
文章平均质量分 86
jvm,锁,集合等
码农key
这个作者很懒,什么都没留下…
展开
-
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 · 374 阅读 · 0 评论 -
说说JUC三个类:CountDownLatch,CyclicBarrier和Semaphore
目录CountDownLatchCyclicBarrierSemaphore总结在JUC中,有三个工具类来辅助我们进行并发编程,分别是CountDownLatch,CyclicBarrier和SemaphoreCountDownLatch英文意味倒计时器。顾名思义,它能够让某个线程等待,直到倒计时结束再执行。假如我想让主线程最后执行。看如下代码(未加CountDownLatch):public class CountDownLatchTest { public static void m原创 2021-03-27 20:46:58 · 347 阅读 · 0 评论 -
java线程的实现
目录前言内核线程实现用户线程实现混合实现java线程实现前言目前来说,线程是java语言进行处理器资源调度的最小单位。一般来说,以一个通用应用的角度来看,实现线程有三种方式。使用内核实现(1:1实现),使用用户线程实现(1:n实现),使用用户线程加轻量级进程实现(n:m实现)内核线程实现内核线程(Kernel-Level Thread,KLT)就是操作系统内核直接操作的线程。每个内核线程都可以视为内核的分身,这样一个操作系统就有了同时处理多任务的能力。而程序一般不会直接使用内核线程。而是使用内核线原创 2021-03-05 16:15:22 · 229 阅读 · 0 评论 -
垃圾回收算法详谈
目录分代收集理论标记-清除算法标记-复制算法标记-整理算法分代收集理论现在大多数的经典垃圾收集器,都遵循分代垃圾回收,就是将内存分为新生代和旧生代进行分代收回。这样的设计是建立在三种假说上弱分代假说:绝大数的对象都是朝生夕灭的强分代假说:熬过越多次的垃圾收集过程的对象就越难消亡跨代引用假说:跨代引用相对于同代引用来说仅占极少数根据前两条的假说,就不难理解分代垃圾设计的原因。如果一个区域的对象都是朝生夕灭的话,那么把他们集中在一起,每次都关注如何保留少量的存活对象而不是去标记那些要消亡的对象,就能原创 2021-03-05 16:22:03 · 210 阅读 · 0 评论 -
由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 · 210 阅读 · 0 评论 -
由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 · 307 阅读 · 0 评论 -
面试官:说说java类的加载机制
前言java语言之所以能够编译一次,到处运行,字节码文件功不可没。字节码文件是将java代码编译后得到。编译好的字节码文件需要通过JVM加载到内存,最终才能与CPU进行交流,java程序才能被执行起来。JVM把描述类的数据从字节码文件加载到内存里,并对数据进行校验,解析转化和初始化,最新形成可以被虚拟机直接使用的Java类型,这个过程被称为虚拟机的类加载机制。一个类从被加载到虚拟机内存中开始,到卸载出内存为止,会经过加载,验证,准备,解析,初始化,使用,卸载共七个阶段。其中验证,准备,解析又被称为连接。原创 2020-11-15 13:00:10 · 341 阅读 · 0 评论 -
java的四种类型的引用
前言判断对象是否存活都与引用抛不开关系。而JDK1.2前的引用是很传统的意思。就比如某个数据中存储的值代表的是另一块内存的地址值,那么就说这个数据代表的是某个内存某个对象的引用。这种概念在某些情况下有点狭隘了。因为这种只代表了引用和非引用两种情况,而对于有些对象,留着没什么关系,丢了也不可惜,内存足够时我留着,内存不足时我丢弃,这样情况下的对象,这种引用的概念没法很好的描述。对此,在JDK1.2后,对引用进行了扩充,分别为:强引用(Strongly Reference)软引用(Soft Referen原创 2020-11-14 13:15:32 · 142 阅读 · 0 评论 -
说说synchronized锁升级过程
前言随着JDK的不断迭代,synchronized锁的性能得到了极大的提升,它早已经不是以前那把笨重的锁了。在JDK1.6前,synchronized只是一把重量级的锁,而jdk1.6后,实现了偏向锁,轻量锁等,引入锁升级的机制,使得synchronized更加高效,性能更好,现在就来讲讲synchronized升级的过程。对象头首先我们要先知道什么是对象头,因为synchronized锁信息是存放在对象头的。一个对象是由对象头,实例数据,填充字节组成。对象头包括:1 Mark Work。记录着原创 2020-10-24 12:35:30 · 1659 阅读 · 0 评论 -
线程池两三讲
浅谈线程池前言线程池七大参数详解线程池工作原理线程池拒绝策略线程池的常用队列前言合理的多线程编程能够充分的利用CPU,内存,IO,网络等资源。但是在阿里巴巴开发手册里提到不能显示的创建线程,就是new Thread。这是因为创建和销毁线程需要一定的开销。在很多情况下,创建和销毁线程加起来的时间要大于使用线程的时间。如果大量的创建和销毁线程,将会造成巨大的系统资源浪费。线程池技术因此诞生。利用线程池,将很好的管理并复用线程,极大的节约了系统资源。但是,阿里巴巴开发手册又明确要求不能使用官方提供的四种线原创 2020-10-05 14:06:27 · 235 阅读 · 0 评论 -
说说关键字volatile
volatile关键字详讲1可见性什么是JMMvolatiele关键字的作用有两个:1:保证变量的可见性2:禁止指令重排1可见性什么叫做可见性,这里需要先说下java内存模型(JMM)什么是JMM先来看一张图原创 2020-10-03 14:57:53 · 346 阅读 · 0 评论 -
浅谈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 · 408 阅读 · 0 评论 -
说说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 · 4187 阅读 · 0 评论