自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

公众号:不止于Java github:https://github.com/cyxpdc?tab=repositories 邮箱:1142439493@qq.com

  • 博客(29)
  • 收藏
  • 关注

原创 《Netty深入剖析》之四:新连接接入

4 Netty新连接接入新连接接入处理逻辑:4.1 检测新连接流程:在3.3的processSelectedKeys方法里:创建NioSocketChannel,封装了NIO的SocketChannelwhile循环条件为allocHandler.continueReading()是用来控制连接接入的速率,默认一次性最大16个连接(maxMessagePerRead),如果超过就结束;...

2019-08-31 23:05:13 250

原创 《Netty深入剖析》之三:NioEventLoop

3 NioEventLoop3.1 NioEventLoop创建流程:深入到MultithreadEventExecutorGroup的构造方法接下来分析这三个子过程3.1.1 ThreadPerTaskExecutor作用每一次执行任务的时候,都会创建一个线程(execute方法)NioEventLoop线程命名规则:nioEventLoop-1(第几个NioEventLoo...

2019-08-31 21:32:05 480

原创 《Netty深入剖析》一、二:Netty基本组件和Netty服务端启动

1 Netty基本组件1.1 网络通信之Netty模型NioEventLoopNioEventLoop#run方法对应着Bio的while(true)轮询,里面存放业务逻辑代码;对应着两个Thread:一个是服务端的监听,一个是对客户端的读写用法:创建两个NioEventLoopGroup,一个bossGroup一个workerGroup;bossGroup是服务端的监听,,w...

2019-08-31 11:17:51 331

原创 JVM之问:JVM内部相关实现

深入拆解Java虚拟机1 为什么 Java 要在虚拟机里运行?1.Java 作为一门高级程序语言,它的语法非常复杂,抽象程度也很高。因此,直接在硬件上运行这种复杂的程序并不现实:C++的策略是直接编译成目标架构的机器码,Java的策略是编译成一个虚拟架构的机器码。这个虚拟架构可以有物理实现,也可以是软件实现,即JRE;所以,在运行 Java 程序之前,我们需要对其进行一番转换;提供了可移...

2019-08-30 10:58:00 219

原创 JVM学习之三:虚拟机类加载机制

《深入理解Java虚拟机》3 虚拟机类加载机制3.1 概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的;这种策略虽然会令类加载时稍微增加一些性能开销,但是会为Java应用程序提供高度的灵活性;Java里天生可以动态扩展的语言特性就是依...

2019-08-30 10:54:24 100

原创 JVM学习之二:垃圾收集(内存回收策略)与内存分配策略

《深入理解Java虚拟机》深入拆解Java虚拟机2 垃圾收集(内存回收策略)与内存分配策略程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作,每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行期会由JIT编译器进行一些优化,但大体上可以认为是编译期可知的);因此这几个区域的内存分配和回收都...

2019-08-30 10:52:42 189

原创 JVM学习之一:Java内存区域与内存溢出异常

《深入理解Java虚拟机》1 Java内存区域与内存溢出异常1.1 运行时数据区域Java运行时,虚拟机内存存放的东西:1.1.1 程序计数器(Program Counter Register)作用可以看作是当前线程所执行字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器完成如果线程正在执行的是一个 Java 方法,计数器记录的是正在执行的...

2019-08-30 10:47:33 150

原创 Java并发(十二)并发模型

极客时间:Java并发编程实战1 Actor模型:面向对象原生的并发模型概念Actor模型本质上是一种计算模型,基本的计算单元称为Actor,Actor之间通过消息进行通信;在Actor模型中,所有的计算都是在Actor中执行的。在面向对象编程里面,一切都是对象;在Actor模型里,一切都是Actor,并且Actor之间是完全隔离的,不会共享任何变量。在Java领域,除了可以使用...

2019-08-23 14:45:41 444

原创 Java并发(十一)并发案例

极客时间:Java并发编程实战1 高性能限流器GuavaRateLimiter令牌桶算法:记录一个下一令牌产生的时间,并动态更新它,就能够轻松完成限流功能与信号量区别:信号量是“一次性可以有多少个线程一起执行”,限流器是“每秒最多允许几个请求通过”“1个请求/xxx秒”申请令牌时调用acquire方法1.如果请求时间now在下⼀令牌产⽣时间next之后:resync:通过(now-ne...

2019-08-23 14:44:45 340

原创 Java并发(十)并发设计模式

极客时间:Java并发编程实战1 Immutability模式将一个类所有的属性都设置成final的,并且只允许存在只读方法,那么这个类基本上就具备不可变性了。更严格的做法是这个类本身也是final的,也就是不允许继承。因为子类可以覆盖父类的方法,有可能改变不可变性所以推荐在实际工作中,使用这种更严格的做法。可以利用享元模式避免创建重复对象,Long、Integer、Short、Byte...

2019-08-23 14:43:05 479

原创 Java并发(九)生产者·消费者实现

1.synchronized实现队列static class MyBlockingQueue<E> { private Queue<E> queue = null; private int limit; public MyBlockingQueue(int limit) { this.limit = limit; ...

2019-08-23 14:38:17 138

原创 Java并发(八)线程知识点

优先级高的线程分配时间片的数量要多于优先级低的线程设置线程优先级时,针对频繁阻塞(休眠或者I/O操作)的线程需要设置较高优先级;而偏重计算(需要较多CPU时间或者偏运算)的线程则设置较低的优先级;确保处理器不会被独占线程优先级不能作为程序正确性的依赖,因为操作系统可以完全不用理会Java线程对于优先级的设定Java线程六种状态:状态变迁:线程调用阻塞式 API 时,在操作系统层...

2019-08-23 14:37:09 213

原创 Java并发(七)异步执行任务之手写线程池、定时任务、CompletableFuture

手写表示子任务:public interface Callable<V> { V call() throws Exception;}表示异步调用的结果:public interface MyFuture <V> { V get() throws Exception ;//返回真正的结果,如果结果还没有计算完成,get会阻塞直到计算完成,如果调用过...

2019-08-23 14:34:41 1239

原创 Java并发(六)显示锁和StampedLock

显式锁可以解决synchronized的限制主要接口和类:锁接口Lock,主要实现类是ReentrantLock读写锁接口ReadWriteLock,主要实现类是ReentrantReadWriteLock相比synchronized,显式锁支持以非阻塞方式获取锁、可以响应中断、可以限时,这使得它灵活的多1 Lockpublic interface Lock { //获取...

2019-08-23 14:29:22 252 1

原创 Java并发(五)synchronized

synchronized1 知识点synchronized可以用于修饰类的实例方法、静态方法和代码块synchronized实例方法实际保护的是同一个对象的方法调用,即当前实例对象,即this,this对象有一个锁和一个等待队列(任意对象都有一个锁和等待队列,还有另一个等待队列,表示条件队列,该队列用于线程间的协作),锁只能被一个线程持有,其他试图获得同样锁的线程需要等待只要访问的是同一...

2019-08-23 14:26:21 238

原创 Java并发(四)并发容器

并发容器写时拷贝技术的容器类写时拷贝是解决并发问题的一种重要思路有两个简单的类CopyOnWriteArrayList和CopyOnWriteArraySet场景:不可变对象的写操作:如String的replace方法,其并没有更改原字符串里面value[]数组的内容,而是创建了一个新字符串;函数式编程:函数式编程的基础是不可变性(Immutability),所以函数式编程里面所有的修...

2019-08-23 14:20:24 233

原创 Java并发(三)并发工具

并发工具1:同步协作工具读写锁ReentrantReadWriteLock信号量Semaphore倒计时门栓CountDownLatch循环栅栏CyclicBarrier交换者Exchanger基于AQS实现在一些特定的同步协作场景中,相比使用最基本的wait/notify、显示锁/条件,它们更为方便,效率更高1 读写锁ReentrantReadWriteLock1.1 场景...

2019-08-23 14:15:58 249

原创 Java并发(二)Java内存模型

3 Java内存模型本质上可以理解为,Java 内存模型规范了 JVM 如何提供按需禁用缓存和编译优化的方法。具体来说,这些方法包括 volatile、synchronized 和 final 三个关键字,以及六项 Happens-Before 规则Happens-Before为语义增强3.1 基础3.1.1 并发编程模型的两个模型和两个关键问题线程之间如何通信及线程之间如何同步:1...

2019-08-23 14:09:16 192

原创 Java并发(一)并发基础

https://www.cnblogs.com/jinshuai86/p/9226164.htmlJava编程的逻辑Java并发编程的艺术极客时间:Java并发编程实战Java并发基础知识并发bug源头缓存导致的可见性问题线程切换带来的原子性问题编译优化带来的有序性问题共享内存出现的问题线程表示一条单独的执行流,每个线程有自己的执行计数器,有自己的栈,但可以共享内存,共享内存是...

2019-08-23 13:58:51 335

原创 Collections源码解析

集合类关系:1 相关方法1.1 针对List接口的二分查找//一个要求List的每个元素实现Comparable接口,另一个不需要,但要求提供Comparator。public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)public st...

2019-08-04 16:46:27 221

原创 EnumSet源码解析

来源:Java编程的逻辑EnumSetEnumSet的实现与EnumMap没有任何关系,而是用极为精简和高效的位向量实现的;位向量是计算机程序中解决问题的一种常用方式1 实现原理1.1 内部组成final Class<E> elementType;//类型信息final Enum[] universe;//枚举类的所有枚举值EnumSet自身没有记录元素个数的变量,...

2019-08-03 14:43:58 174

原创 EnumMap源码解析

来源:Java编程的逻辑如果需要一个Map的实现类,并且键的类型为枚举类型,可以使用HashMap,但应该使用一个专门的实现类EnumMap因为枚举类型有两个特征,一是它可能的值是有限的且预先定义的,二是枚举值都有一个顺序,这两个特征使得可以更为高效的实现Map接口EnumMap是保证顺序的,输出按照键在枚举中的顺序内部基于数组实现1 实现原理1.1 内部组成private fin...

2019-08-03 11:57:43 168

原创 LinkedHashMap和LinkedHashSet源码解析

参考:Java编程的逻辑https://blog.csdn.net/blingfeng/article/details/79974169LinkedHashMap(JDK1.8)public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>是HashMap的子类,但可以...

2019-08-03 10:50:32 536

原创 ArrayDeque源码解析

来源:Java编程的逻辑基于动态扩展的循环数组实现的双端队列一般而言,由于需要移动元素,数组的插入和删除效率比较低,但ArrayDeque的效率却非常高,因为内部是循环数组2 实现原理2.1 Deque接口此接口扩展了Queue接口,可以看做一个先进先出的队列,还可以看做栈2.2 内部组成主要有如下实例变量:transient Object[] elements;transie...

2019-08-02 22:44:21 256 1

原创 PriorityQueue源码分析

来源:Java编程的逻辑1 前导将新的头部与两个孩子节点中较小的比较,如果不大于该孩子节点,则满足堆的性质,结束,否则与较小的孩子进行交换,交换后,再与较小的孩子比较和交换,一直到没有孩子,或者不大于两个孩子节点。这个过程我们般称为siftdown与父节点比较,如果大于等于父节点,则满足堆的性质,结束,否则与父节点进行交换,然后再与父节点比较和交换,直到父节点为空或者大于等于父节点;称之为...

2019-08-02 17:31:13 234

原创 TreeSet源码解析

来源:Java编程的逻辑1 实现原理1.1 构造方法TreeSet的基本构造方法有两个:public TreeSet() { this(new TreeMap<E,Object>());}public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<>(co...

2019-08-01 21:42:34 337

原创 TreeMap源码解析

参考:Java编程的逻辑1 前导知识排序二叉树找到一个节点的后继节点的算法:1.如果该节点有右孩子,则后继为右子树中最小的节点。2.如果该节点没有右孩子,则后继为父节点或某个祖先节点,从当前节点往上找,如果它是父亲节点的右孩子,则继续找父节点,直到它不是右孩子或父节点为空,第一个非右孩子节点的父亲节点就是后继节点,如果找不到这样的祖先节点,则后继为空,遍历结束。例子:绿色箭头代表当前节...

2019-08-01 19:39:27 137

原创 HashSet源码解析

来源:Java编程的逻辑1 实现原理1.1 内部组成HashSet内部是用HashMap实现的,它内部有一个HashMap实例变量,如下所示:private transient HashMap<E,Object> map;我们知道,Map有键和值,HashSet相当于只有键,值都是相同的固定值,这个值的定义为:private static final Object PR...

2019-08-01 16:44:00 98

原创 HashMap源码解析(JDK1.8)

来源:https://mp.weixin.qq.com/s/I6KFAO1n9IQznieUZL95YAhttps://mp.weixin.qq.com/s/MVOqN8mbUtaU0ClUmS4qKwJava编程的逻辑HashMap1 Map接口定义public interface Map<K,V> { int size(); boolean isEmp...

2019-08-01 14:58:01 188

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除