![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 66
松间-明月
这个作者很懒,什么都没留下…
展开
-
基于Java Selector实现网络通信
基于Java Selector实现网络通信服务端代码整体思路启动一个ServerSocket,注册到Selector上无限轮询,从Selector上获取有事件的Socket根据事件Socket类型,进行accept或者read处理代码package zx.io;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channel原创 2022-01-18 20:30:51 · 273 阅读 · 0 评论 -
G1 GC 全过程与核心原理介绍
G1GC 全过程与核心原理介绍G1内存布局G1垃圾回收器内存布局【链接:1】G1垃圾回收全过程整体过程介绍G1垃圾回收整体分为2个阶段,分别是仅年轻代回收阶段(young-only)和空间回收阶段(space reclamation)。这两个阶段不断交替,相互转换。在年轻代回收阶段,每次回收都会有对象升级,当年龄达到阈值,就会变成老年代对象,放到old区。当old区占比达到一个设定的阈值,就会进入空间回收阶段,释放出空间,然后又进入年轻代回收。要进行一次空间回收,前提条件是找出空间中所有的垃圾,原创 2021-11-14 21:07:54 · 3415 阅读 · 0 评论 -
如何高效实现内存分页?
如何高效实现内存分页?使用guava工具类 public static void main(String[] args) { ArrayList<Integer> list = Lists.newArrayList(); for (int i = 0; i < 8; i++) { list.add(i); } int pageSize=10; int pageNum=1;原创 2021-05-21 20:26:43 · 324 阅读 · 0 评论 -
ThreadLocal和线程上下文-入门
ThreadLocal和线程上下文经过学习和理解,总结了以下经验:真正的主角是线程上下文,而不是ThreadLocalThreadLocal的本质是实现Java线程私有map变量的一个工具类,所以,提供的最核心的方法就是set和get如果引入线程上下文的概念,那么,ThreadLocal就是实现线程上下文功能的工具类摘要本文主要的目的是实现ThreadLocal的入门,基于自己的理解给出一个比较容易懂的ThreadLocal定义,并且结合线程上下文的概念,给出ThreadLocal的定位。本原创 2021-01-10 19:57:48 · 660 阅读 · 0 评论 -
使用MultipartEntityBuilder实现文件上传
使用MultipartEntityBuilder实现文件上传参考:【1】原理从httpclient 4.3开始,使用MultipartEntityBuilder实现文件上传文件或者文件流可以封装成ContentBody,进而被封装到MultipartEntityBuilder中,再创建出multipartEntity,作为HTTP请求的HttpEntity,最终被发送到服务端。整个对象封装流程如下:File/Stream>>ContentBody>>MultipartE原创 2020-09-13 22:47:48 · 9226 阅读 · 0 评论 -
Guava工具包高效开发实践系列
利用Guava工具包提高开发效率guava是谷歌提供的java开发的公共基础类库,提供了各种强大的基础功能,能够极大地简化我们的代码,提高开发效率,被称为java中的瑞士军刀。用Guava的TTL Cache高效实现本地缓存用法首先创建一个缓存对象,设置最大数量和超时时间Cache<String, String> ttlMap = CacheBuilder.newBuilder() .maximumSize(5) .expireAfterWrite(10, TimeUnit.S原创 2020-09-07 22:30:43 · 302 阅读 · 1 评论 -
HashMap源码学习笔记
从刚开始学习java,就觉得HashMap底层实现原理是一个非常高大上的问题,以至于从开始接触到现在2年时间过去了,都没有详细研究过。最近在不断写博客的过程中逐步培养起了源码阅读和官方文档阅读的习惯,所以也激起了研究HashMap原理学习的兴趣。HashMap相关的问题特别多,这也是我们经常对其望而却步的原因。所以,本文不会对HashMap的各个细节问题都进行阐述,这一版会集中解决HashMap的几个关键问题和经常被问到的一些细节知识点。从而搭建起对HashMap一个初级地较为全面的认识,为后续进阶做好准原创 2020-09-05 22:32:15 · 273 阅读 · 0 评论 -
Java如何自定义注解(应用篇)
如何自定义注解实现步骤以SpringBoot的@Autowired为例,自定义一个@Autowired,实现依赖的自动注入创建一个注解,添加四个必要的元注解@Retention(RetentionPolicy.RUNTIME) //运行时注解@Target(ElementType.FIELD) //作用于字段@Inherited@Documentedpublic @interface MyAutowired {}创建一个Controller类和一个Service类,将一个Serv原创 2020-07-30 22:02:48 · 486 阅读 · 0 评论 -
AQS源码学习笔记
AQS源码分析-以ReentrantLock为例(青铜)前言摘要java实现线程同步最主要的2种方式是synchronized同步和工具锁,这两种同步机制在原理上有着较大的区别,在之前的一篇博客中,已经对synchronized原理做了简要描述,本文的主要目的是分析工具锁的原理。java提供的工具锁主要有ReentrantLock、CountDownLatch、CyclicBarrier、Semaphore等,这些工具锁的实现都依赖于java提供的一个同步器框架AbstractQueuedSynch原创 2020-07-25 22:21:09 · 145 阅读 · 0 评论 -
synchronized锁升级过程分析
synchronized锁升级过程分析(青铜版)摘要本文的目的在于从主流程上说明以下问题:synchronized修饰对象的锁一共有几种状态synchronized修饰对象锁升级的过程是怎样的本文的研究方法是查看openjdk的官方文档,链接为https://wiki.openjdk.java.net/display/HotSpot/Synchronization#Synchronization-Russel06。建议大家也可以直接看官方文档,描述肯定会更加准确。由于对象的锁信息和对象的内存原创 2020-06-20 23:06:59 · 429 阅读 · 0 评论 -
如何理解反射
如何理解反射基础关键问题本文主要的目标是回答以下问题:创建对象可以使用new,为什么我还需要反射?如何使用反射创建未知类的对象?调用未知类的方法?反射的定义学习反射时,我们最不理解的一个问题就是,我要创建对象,直接使用new就可以了,为什么还需要反射?通过下面的定义,应该能够回答这个问题。【核心定义】java反射机制就是对于任意一个未知的类,都能够创建其对象,调用其方法。反射和new的区别:new只能针对编译阶段已经存在的类,如果在编译时这个类不存在,就无法创建对象,因为你都不知原创 2020-06-06 18:30:46 · 1099 阅读 · 0 评论 -
Volatile是如何保证线程可见的?
本文以volatile最常见的2个问题为线索,基于汇编lock前缀指令和cpu原子操作等底层知识,初步对volatile的底层原理进行描述。通过本文的论述,基本上能够解释以下2个问题:1)为什么volatile能够保证线程可见性?2)为什么volatile不能实现操作原子性?原创 2020-05-30 13:41:37 · 1412 阅读 · 3 评论