java相关
aa1215018028
这个作者很懒,什么都没留下…
展开
-
protobuf3的语法
本文主要讨论protobuf3在编写proto接口描述文件时的语法,下面是一个proto文件的实例:syntax = "proto3";import "address.proto";package com.study.blog.protobuf;option java_package = "com.study.blog.protobuf";/option java_outer_classname="PersonProto";option java_multiple_files = .原创 2021-01-13 14:10:43 · 835 阅读 · 0 评论 -
分布式系统架构常见知识点梳理
这篇文章主要是说在进化的过程中可能会遇到的问题以及如何去解救这些问题。一、客户端缓存优化1、添加CDN缓存CDN 缓存也叫作网络访问的“第一跳”,用户请求先到达的是互联网网络服务商的机房。在机房里面部署 CDN 服务器,提供缓存服务。缓存了一些静态资源。如果存在用户请求的内容,直接通过CDN进行返回;没有的话继续向下请求2、正向代理缓存正向代理缓存保存在客户端,代理客户端访问互联网,比如访问谷歌,直接访问不到,我们就可以使用一个代理服务器,将请求转发给代理服务器,代理..原创 2020-10-26 10:54:06 · 2372 阅读 · 0 评论 -
Netty内存管理详解
前言正是Netty的易用性和高性能成就了Netty,让其能够如此流行。而作为一款通信框架,首当其冲的便是对IO性能的高要求。不少读者都知道Netty底层通过使用Direct Memory,减少了内核态与用户态之间的内存拷贝,加快了IO速率。但是频繁的向系统申请Direct Memory,并在使用完成后释放本身就是一件影响性能的事情。为此,Netty内部实现了一套自己的内存管理机制,在申请时,Netty会一次性向操作系统申请较大的一块内存,然后再将大内存进行管理,按需拆分成小块分配。而释放时,Nett原创 2020-09-27 17:19:16 · 1859 阅读 · 4 评论 -
Java NIO知识点详解
前言抱歉好久没更原创文章了,看了下上篇更新时间,已经拖更一个多月了。这段时间也一直在学习Netty相关知识,因为涉及知识点比较多,也走了不少弯路。目前网上关于Netty学习资料玲琅满目,不知如何下手,其实大家都是一样的,学习方法和技巧都是总结出来的,我们在没有找到很好的方法之前不如按部就班先从基础开始,一般从总分总的渐进方式,既观森林,又见草木。之前恰巧跟杭州一个朋友小飞也提到过,两者在这方面的初衷是一致的,也希望更多的朋友能够加入一起学习和探讨。(PS:本篇文章是和小飞一起学习整理所得~)原创 2020-09-25 17:44:55 · 494 阅读 · 0 评论 -
JDK1.8并发之synchronized和Lock
什么是线程安全? 线程安全是指保证多线程环境下共享的、可修改的状态的正确性。保证线程安全的两个办法: 封装:将对象的内部状态隐藏、保护起来。 不可变:final变量产生了某种程度地不可变(immutable)效果,可以用于保护只读数据。线程安全需要保证几个基本特性: 原子性:相关操作不会中途被其他线程干扰,一般通过同步机制实现。 可见性:一个线程修改了某个共享变量,其状态能够立即被其他线程知晓,通常被解释为将线程本地状态反映到主内存上,volatile就...原创 2020-05-21 23:32:27 · 605 阅读 · 0 评论 -
Java线程池核心知识详解
本文所说的“核心线程”、“非核心线程”是一个虚拟的概念,是为了方便描述而虚拟出来的概念,在代码中并没有哪个线程被标记为“核心线程”或“非核心线程”,所有线程都是一样的,只是当线程池中的线程多于指定的核心线程数量时,会将多出来的线程销毁掉,池中只保留指定个数的线程。那些被销毁的线程是随机的,可能是第一个创建的线程,也可能是最后一个创建的线程,或其它时候创建的线程。一开始我以为会有一些线程...原创 2020-01-06 19:54:20 · 2753 阅读 · 0 评论 -
SpringBoot整合log4j2详细教程
首先,认识一下三胞胎log4j是apache实现的一个开源日志组件 logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现 Log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活...原创 2019-10-28 16:50:46 · 1106 阅读 · 0 评论 -
java自定义线程池详细使用说明
前言线程池想必大家也都用过,JDK的Executors 也自带一些线程池。但是不知道大家有没有想过,如何才是最优雅的方式去使用过线程池吗? 生产环境要怎么去配置自己的线程池才是合理的呢?今天周末,刚好有时间来总结一下自己所认为的'优雅', 如有问题欢迎大家指正。线程池使用规则要使用好线程池,那么一定要遵循几个规则:线程个数大小的设置 线程池相关参数配置 利用Hook嵌入你的行...原创 2019-10-25 15:27:07 · 924 阅读 · 0 评论 -
log4j2日志配置说明
在项目推进中,如果说第一件事是搭Spring框架的话,那么第二件事情就是在Sring基础上搭建日志框架,我想很多人都知道日志对于一个项目的重要性,尤其是线上Web项目,因为日志可能是我们了解应用如何执行的唯一方式。在18年大环境下,更多的企业使用Springboot和Springcloud来搭建他们的企业微服务项目,此篇文章是博主在实践中用Springboot整合log4j2日志的总结。...原创 2019-10-24 20:58:17 · 1105 阅读 · 1 评论 -
EnumSet基本用法
EnumSet基本用法enum Season { SPRING, SUMMER, FALL, WINTER}public class EnumSetTest { public static void main(String[] args) { //创建一个EnumSet集合,集合元素就是Season枚举类的全部枚举值 EnumSet ...原创 2019-10-17 12:07:49 · 1170 阅读 · 0 评论 -
Spring @Bean 注解使用详解
@Bean 的用法@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名定义bean下面是@Configuration里的一个例子@Configurationpublic class AppConfig { @Bean public TransferService transfer...原创 2018-06-11 15:50:55 · 2694 阅读 · 0 评论 -
Java 多线程编程 — 锁优化
原文出处: melonstreet并发环境下进行编程时,需要使用锁机制来同步多线程间的操作,保证共享资源的互斥访问。加锁会带来性能上的损坏,似乎是众所周知的事情。然而,加锁本身不会带来多少的性能消耗,性能主要是在线程的获取锁的过程。如果只有一个线程竞争锁,此时并不存在多线程竞争的情况,那么JVM会进行优化,那么这时加锁带来的性能消耗基本可以忽略。因此,规范加锁的操作,优化锁的使用方法,避免不必要的...转载 2018-06-12 17:46:32 · 135 阅读 · 0 评论 -
Java10 新特性
https://www.oschina.net/translate/109-new-features-in-jdk-10?p=2#comments原创 2018-07-04 20:29:48 · 214 阅读 · 0 评论 -
Java10 新特性
JAVA10发布也有一段时间了,这段时间正好有空,从官网更新了JDK玩了玩。在使用中却发现以前版本的eclipse以及idea都不支持JAVA10,我想可能是因为var类型的引入,IDE需要做适配吧。所幸的是,eclipse4.7.3发布很快,可以完美支持JAVA10。 下面的更新内容翻译的很全,对学习很有帮助,转载于: https://www.oschina.net/translat...原创 2018-06-13 11:50:00 · 229 阅读 · 0 评论 -
Java8 函数式编程详解
Java8 函数式编程详解说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与Stream,毕竟Java9都已近发布了,Java8发布了也已经近三年。那么,今天我们就先来讲一下Java8引入的Lambda表达式,以及由此引入的函数式编程,以及函数式接口。什么是函数式编程函数式编程并不是Java新提出的概念,其与指令编程相比,强调函数的计算比指令的计算更重要;与过程化编程...原创 2018-06-13 14:02:57 · 247 阅读 · 0 评论 -
StringBuffer用法详解
1、StringBuffer对象的初始化StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化。例如:StringBuffer s = new StringBuffer();这样初始化出的StringBuffer对象是一个空的对象,就是我犯的错误。如果需要创建带有内容的StringBuffer对象,则可以使用:Stri...原创 2018-06-13 17:49:44 · 639 阅读 · 0 评论 -
简单RPC框架实现
一、RPC简介RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议。它允许像调用本地服务一样调用远程服务。它可以有不同的实现方式。如RMI(远程方法调用)、Hessian、Http invoker等。另外,RPC是与语言无关的。 RPC示意图如上图所示,假设Computer1在调用sayHi()方法,对于Computer1而言调用sayHi()方法...原创 2018-06-22 13:40:33 · 339 阅读 · 0 评论 -
String、StringBuffer与StringBuilder区别
工作中很多时候都会用到String,封装类的时候为了方便省劲也是能用String就不用其他的(不建议这样做),关于字符串的操作有String,StringBuffer,StringBuilder三种形式,今天整理一下梳理一下记忆。1 String、StringBuffer与StringBuilder区别(1)区别String内容不可变,StringBuffer和StringBuilder内容可变;...原创 2018-06-09 09:54:52 · 168 阅读 · 0 评论 -
JDK8-Optional容器的作用
空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。Optional实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很...原创 2018-06-09 09:59:52 · 1594 阅读 · 2 评论 -
java如何创建并运行线程
如何创建并运行java线程 Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类。 可以用如下方式用java中创建一个线程:Tread thread = new Thread();执行该线程可以调用该线程的start()方法:thread.start();在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了。编...原创 2018-06-09 10:41:59 · 569 阅读 · 0 评论 -
Java进阶——JVM加载class文件的原理机制
Java进阶——JVM加载class文件的原理机制阅读目录1、JVM 简介2、JVM 的组成部分3、JVM加载class文件的原理机制 在面试java工程师的时候,这道题经常被问到,故需特别注意。回到顶部1、JVM 简介 JVM 是我们Javaer 的最基本功底了,刚开始学Java 的时候,一般都是从“Hello World ”开始的,然后会写个复杂点class ,然后再找一些开源框架,比如...原创 2018-06-09 14:10:08 · 5132 阅读 · 0 评论 -
2018年常用的7款Java框架
虽然Java一直被唱衰,但是直到现在Java软件开发也坚持霸主地位不动摇,毫无疑问,Java是目前最热门的编程语言之一,所以好程序员为大家收集了目前较受欢迎的java框架消息。千锋Java培训课程坚持稀有的全程面授课程,大牛讲师通过四大课程阶段,带领学员把Java语言学到不可思议的高度。 1.SpringMVC 中国有句俗话叫“姜还是老的辣”,所以SpringM...原创 2018-06-18 10:38:14 · 32077 阅读 · 2 评论 -
2018 年 Java 程序员必读的十本书
大家好,如果你是一名 Java 程序员,正在考虑 2018 年读什么书,那么这篇文章正适合你。本文中,我将分享 10 本有关 Java、Spring 及其他相关技术的书籍。 这里面既有适合经验丰富的 Java 程序员的书,它们介绍了架构、云开发、微服务、Java 9、Spring 5,以及用于提高生产效率的 Kotlin。同时也照顾到了初级的、缺乏经验的、或正打算 2018 年开始入门 Java ...原创 2018-06-18 11:02:39 · 6624 阅读 · 1 评论 -
Java8 lambda表达式10个示例
例1、用lambda表达式实现Runnable我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例。看一下Java 8之前的runnable实现方法,需要4行代码,而使用lambda表达式只需要一行代码。我们在这里做了什么呢?那就是用() -> {}代码块替代了整个匿名类。// Java 8之前:new Thread(new ...转载 2018-06-18 11:21:38 · 224 阅读 · 0 评论 -
java内存模型
1. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一。一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题,它代表着一秒内服务器平均能响应的请求数,而TPS值与程序的并发能力有着非常密切的关系。在讨论Java内存模型和线程之前,先简单介绍一下硬件的效率与一致性。2.硬件的效率与一致性 由于计算机的存储...原创 2018-06-10 20:31:36 · 103 阅读 · 0 评论 -
Java中的锁分类
Java中的锁分类在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下:公平锁/非公平锁可重入锁独享锁/共享锁互斥锁/读写锁乐观锁/悲观锁分段锁偏向锁/轻量级锁/重量级锁自旋锁上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。公平锁/非公平锁公平锁是指多个线程按照申请锁的顺序...原创 2018-06-10 21:01:57 · 197 阅读 · 1 评论 -
JDK 8 函数式编程入门
1. 概述1.1 函数式编程简介我们最常用的面向对象编程(Java)属于命令式编程(Imperative Programming)这种编程范式。常见的编程范式还有逻辑式编程(Logic Programming),函数式编程(Functional Programming)。函数式编程作为一种编程范式,在科学领域,是一种编写计算机程序数据结构和元素的方式,它把计算过程当做是数学函数的求值,而避免更改状...原创 2018-06-30 10:32:37 · 315 阅读 · 0 评论 -
GitHub 上最受欢迎的 5 大 Java 项目
本文列举了 GitHub 上最受欢迎的 5 个 Java 项目,从 Mockitos 到 Guava,以及 java-design-patterns 等。GitHub 上有大约有 744K 多的 Java 项目,但是最让开发人员感兴趣的有哪些项目?1. MockitoMockito 并不是无酒精混合饮料的意思。Mockito 是一个针对 Java 的 mocking 框架。它与 EasyMock ...原创 2018-06-26 08:28:57 · 534 阅读 · 0 评论 -
使用Guava的RateLimiter做限流
场景: 1. 在日常生活中,我们肯定收到过不少不少这样的短信,“京东最新优惠卷…”,“天猫送您…”。这种类型的短信是属于推广性质的短信。这种短信一般群发量会到千万级别。然而,要完成这些短信发送,我们是需要调用服务商的接口来完成的。倘若一次发送的量在200万条,而我们的服务商接口每秒能处理的短信发送量有限,只能达到200条每秒。那么这个时候就会产生问题了,我们如何能控制好程序发送短信时的速度昵?于是...原创 2018-06-30 14:18:56 · 3958 阅读 · 0 评论 -
Java抽象类与接口的区别
很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题。本文我们将仔细讨论这些话题。在讨论它们之间的不同点之前,我们先看看抽象类、接口各自的特性。抽象类抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。以JDK中的GenericServlet为例:123456789public abs...原创 2018-06-26 16:45:09 · 124 阅读 · 0 评论 -
java初学者指南
笔者建议初学者学习Java的方式:看书+视频+实践(初学最难的问题其实还是在环境)Java学习书籍推荐《Head First Java.第二版》:可以说是我的Java启蒙书籍了,特别适合新手读当然也适合我们用来温故Java知识点。《Java核心技术卷1+卷2》:很棒的两本书,建议有点Java基础之后再读,介绍的还是比较深入的,非常推荐。《Java编程思想(第4版)》:这本书要常读,初学者可以快速概...原创 2018-06-27 08:51:54 · 2074 阅读 · 0 评论 -
java中stringBuilder的用法
一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。 在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接...原创 2018-07-03 08:33:22 · 1028 阅读 · 1 评论 -
java CAS详解
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile是不错的机制,但是volatile不能保证原子性。因...原创 2018-06-28 14:29:54 · 141 阅读 · 0 评论 -
java中深浅拷贝概念
Java中对象的创建clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢?1 使用new操作符创建一个对象2 使用clone方法复制一个对象那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存。程序执行到new操作符时...原创 2018-07-03 19:11:44 · 373 阅读 · 0 评论 -
java GC 垃圾回收器种类
Java的内存分配与回收全部由JVM垃圾回收进程自动完成。与C语言不同,Java开发者不需要自己编写代码实现垃圾回收。这是Java深受大家欢迎的众多特性之一,能够帮助程序员更好地编写Java程序。下面四篇教程是了解Java 垃圾回收(GC)的基础:垃圾回收简介圾回收是如何工作的?垃圾回收的类别垃圾回收监视和分析这篇教程是系列第一部分。首先会解释基本的术语,比如JDK、JVM、JRE和HotSpot...原创 2018-06-28 19:55:11 · 364 阅读 · 0 评论 -
JAVA 同步实现原理
Synchronized的基本使用Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:确保线程互斥的访问同步代码保证共享变量的修改能够及时可见有效解决重排序问题。从语法上讲,Synchronized总共有三种用法:修饰普通方法修饰静态方法修饰代码块接下来我就通过几个例子程序来说明一下这三种使用方式(为了便于比较,三段代...原创 2018-06-28 20:01:35 · 215 阅读 · 0 评论 -
java 常用集合list与Set、Map区别及适用场景总结
1、List,Set都是继承自Collection接口,Map则不是2、List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用...原创 2018-06-29 15:48:04 · 135 阅读 · 0 评论 -
java泛型基础
泛型基础【介绍泛型、泛型类、泛型方法、通配符、擦除、应用】2018.04.10 22:42 184浏览 字号tags: Java基础前言从今天开始进入Java基础的复习,可能一个星期会有一篇的<十道简单算法>,我写博文的未必都是正确的~如果有写错的地方请大家多多包涵并指正~今天要复习的是泛型,泛型在Java中也是个很重要的知识点,本文主要讲解基础的概念,并不是高深的知识,如果基础好的同...原创 2018-07-05 10:13:56 · 353 阅读 · 0 评论 -
JVM命令使用演示
之前推送了一本jvm相关的书籍 【JVM Troubleshooting Guide】书籍推荐及下载,个别小伙伴反馈说关于jvm看了不少资料,有些印象,但是不知道如何使用那些命令。 就着这个前提,简单演示一下jvm一些命令的使用。(温馨提示,由于jvm命令返回的字符串偏长一些,手机上效果差一些,建议在电脑上看)首先,先准备一段代码,直接运行一个java程序也可以,比如:@Sl...原创 2018-07-17 21:25:48 · 301 阅读 · 0 评论 -
java的动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是java的动态代理机制,所以本篇随笔就是对java的动态机制进行一个回顾。在java的动态代理机制中,有两个重要的类或接口,一...原创 2018-07-06 09:29:06 · 185 阅读 · 0 评论