- 博客(16)
- 资源 (2)
- 收藏
- 关注
原创 Gitlab安装与部署(Linux)
搭建需要安装下载gitlabCE社区版2.配置Postfix以发送邮件3.配置极狐GitLab软件源镜像。4.执行如下命令开始安装。
2022-07-26 15:39:43 707
原创 线程上下文类加载器
当前类加载器(Current Classloader)每一个类都会使用自己的类加载器(即加载自身的类加载器)来去加载其他类(指的是所依赖的类)如果ClassX引用了ClassY,那么ClassX的类加载器就会去加载ClassY(前提是ClassY尚未被加载)线程上下文类加载器(Context Classloader)线程上下文类加载器是由jdk1.2引入的,类Thread中的getContextClassLoader()与setContextClassLoader(ClassLoader c
2022-04-28 14:55:38 2510
原创 类加载器与双亲委托模型
有两种类型的类加载器Java虚拟机自带的加载器 根类加载器(Bootstrap) 扩展类加载器(Extension) 系统(应用)类加载器(System)AppClassLoader 用户自定义的类加载器 Java.lang.ClassLoader的子类 用户可以定制类的加载方式 类加载器并不需要等到某个类被主动使用时再加载它JVM规范允许类加载器再预料某个类将要被使用时就预先加载它,如果再预先加载的过程中遇到了.class文件缺失或者存在的错误,类加载器必须再程序首
2022-04-28 14:49:35 97
原创 使用Netty完成一个简单的聊天室服务器端和客户端
客户端import java.io.BufferedReader;import java.io.InputStreamReader;import io.netty.bootstrap.Bootstrap;import io.netty.channel.Channel;import io.netty.channel.ChannelFuture;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEven
2022-04-23 13:00:17 168
原创 JVM类的初始化步骤
假如这个类还没有被加载和连接,那就先进行加载和连接 假如类存在直接父类,并且这个父类还没有被初始化,那么就先初始化直接父类 假如类中存在初始化语句,那就依次执行这些初始化语句类加载的初始化赋值是按照代码声明的顺序进行public class ClassLoadTest { /** * 当调用一个类的静态方法时触发对这个类进行初始化 * @param args */ public static void main(String[] args) { Singleton sing
2022-04-22 11:34:56 445
原创 JVM类加载器
类的加载指的是将类的.class文件中的二进制数据读取到内存中,将其放在运行时数据的方法区内,然后在内存中创建一个java.lang.Class对象(规范并说明Class对象位于在哪里,HotSpot虚拟机将其放在了方法去中)用来封装类在方法去内的数据结构。在java代码中,类型的加载、连接与初始化的过程都是在程序运行期间完成的 提供了更大的灵活性,增加了更多的可能性一.类的五个阶段加载:查找并加载类的二进制数据 连接: 验证:确保被加载类的正确性 准备:为类的静态变量分配内存,并将
2022-04-21 16:56:45 91
原创 简单的protobuf序列化与反序列化的例子
protobuf是一个google提供的序列化与反序列化的项目如果想使用protobuf,首先需要下载protobuf的编译器下载地址:https://github.com/protocolbuffers/protobuf/releaseshttps://github.com/protocolbuffers/protobuf/releases根据系统选择对应的protoc编译器下载完成后,需要在项目中声明一个*.proto的文件作为数据格式的声明文件新建:Student.protos.
2022-04-20 16:25:45 1850
原创 java使用Redisson解决缓存穿透、缓存击穿、缓存雪崩
Redisson是架设在Redis基础上的一个Java驻内存数据网格(In-Memory Data Grid)。Redisson在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的一系列优势,在Java实用工具包中常用接口的基础上,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。在
2022-04-16 13:40:59 2613
原创 list并行流parallel的使用,Collectors进行分组分区,自定义Collector的使用方式
list并行流parallel的使用,Collectors进行分组分区 public static void main(String[] args) { Student s1 = new Student("zhangsna",90); Student s2 = new Student("wang",45); Student s3 = new Student("zhaosl",50); Student s4 = new Student("zhaosl",50); Student s5
2022-04-14 21:31:20 1866
原创 java8 使用方法引用(::)的四种方式
在java8中提供了方法引用的方式,简化了lambda表达式写法,方法引用本质上是lambda表达式的语法糖 并没有提供新的功能和特性,写法为两个冒号 "::"import java.util.Arrays;import java.util.Collections;import java.util.List;import java.util.function.BiFunction;public class MethodReferenceTest { public static void
2022-04-14 13:10:56 3115 1
原创 Java8使用list.stream操作元素的基本方法
jdk8引入Stream流的概念 流中包含 源、中间过程、终止操作,当流声明源和中间过程时代码并不会执行,只有执行终止操作时才会执行 public static void main(String[] args) { //jdk8引入Stream流的概念 流中包含 源、中间过程、终止操作,当流声明源和中间过程时代码并不会执行,只有执行终止操作时才会执行 //新建一个stream Stream stream1 = Stream.of("hello","world","hello world"
2022-04-14 12:39:45 4300
原创 JDK8提供的基础函数接口Supplier,Function,BiFunction,BinaryOperator,Consumer,Predicate,Optional的使用方法
Supplier<T>为函数式接口 不接受参数返回一个值public class SupplierTest { public static void main(String[] args) { SupplierTest test = new SupplierTest(); Person person = new Person("zhangshan","1"); //以下等价 //1. Supplier<Person> supplier
2022-04-13 09:32:51 462
原创 JDK8使用java.time包简化开发者处理时间类型的数据常用方法
JDK8发布之前日期处理方式,如下 //java8之前日期解决方案 //SimpleDateFormat为线程不安全 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(new Date())); String dateStr = "2022-04-12 19:18:06"; Date date; try { date = sd
2022-04-12 20:18:09 282
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人