java
文章平均质量分 86
高级Java进阶之路
互联网大厂资深架构师,高并发专家,精通jvm、字节码、中间件
展开
-
类型安全的http客户端retrofit介绍、使用、实现原理分析
retrofit介绍retrofit是一个http访问客户端,类似okhttp、apache httpclient,不过retrofit是类型安全的,也就是定义一个强类型的http客户端接口使用,而不是请求url返回一个string的结果,再拿string去解析字段,这样开发时更加安全,能帮助开发者省去请求参数结果转换的繁琐重复工作,它的思想类似Mybatis、spring data等。使用添加maven依赖<dependency> <...原创 2021-12-20 20:09:56 · 692 阅读 · 0 评论 -
springboot-只能用于web服务开发?不创建web服务也能使用spring bean
spring除了开发web服务外,在其他的需求中也是可以使用的,比如我们只想实现一个简单的爬虫,爬到数据之后写入数据库,我们一定要创建一个web服务来通过接口触发各个方法的调用吗,可能有很多小伙伴使用spring都是在公司的web项目中使用,如果脱离web环境都不会写代码了,今天我们就看一下,使用springboot怎么不启动web服务也能运行spring代码。有了这个功能,我们在开发一些小的需求的时候非常方便,不用再去羡慕python等语言。假设我们现在写好了希望运行的...原创 2021-12-19 22:36:58 · 2952 阅读 · 0 评论 -
springboot - 搭建spring data jpa简单快速实现数据库读写
访问数据库是代码开发中最常见的任务之一,springboot搭配上spring data项目,在读写数据库的场景上非常简单方便好用,写起读写数据库代码来轻松愉快。本次实现的功能本次我们实现一个非常简单的数据写入、查询的功能。假设我们在开发一个股票交易系统中的一个小模块,这个模块负责上市公司的录入和查询。需要提供的功能是能够写入上市公司名称和对应的代码,能够根据代码查询上市公司的名称。创建数据库、建表如果在本地搭建数据库,可以用docker快速启动一个mysq...原创 2021-12-19 10:03:00 · 821 阅读 · 0 评论 -
为什么Java的lambda或匿名内部类中用到的外部局部变量需要声明成final或是effectively final的?
相信很多同学在开发过程中都遇到过类似的IDE提示,当我们在lambda表示中或匿名内部类中访问一个局部变量时,这个变量如果在方法内进行了重新赋值,则IDE/编译器会抛出一个Variable used in lambda expression should be final or effectively final这样的异常,那么为什么lambda表达式或匿名内部类中用到的变量需要是final或effectively final的呢?(effective final是指虽然变量...原创 2021-12-18 16:01:46 · 537 阅读 · 0 评论 -
Random类导致抢红包接口出现严重性能问题
生成随机数是一个常见的功能,例如我们给用户生成随机红包。但是你知道java.util.Random类在高并发的情况下具有性能问题和安全问题吗?我们在高并发常见下应该如何生成随机数呢?要知道为什么java.util.Random类具有性能问题,得深入到其中是实现来探究一下。首先看一下Random类的doc说明 An instance of this class is used to generate a stream of pseudorandom numbers....原创 2021-12-18 15:57:15 · 751 阅读 · 0 评论 -
ThreadLocal里的巧妙设计、常见面试问题,其他文章里写的一定是对的吗?
ThreadLocalThreadLocal的作用是什么?使用时有哪些注意事项?为什么ThreadLocalMap中的Entry要使用WeakReference?netty中FastThreadLocal又做了什么优化?答案尽在本文中。ThreadLocal介绍用ThreadLocal修饰的变量,一般我们称为线程本地变量。那么一般什么情况下会使用ThreadLocal呢? 解决线程安全问题。线程安全问题一般是多个线程对共享可变变量变量的修改问题,那么如果线...原创 2021-12-18 15:37:04 · 456 阅读 · 0 评论 -
mybatis spring介绍、使用、实现原理
maven依赖<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version></dependency>使用SqlSessionFactoryBean 可以创建sqlSessionFactory,dataSo...原创 2021-12-18 15:31:24 · 491 阅读 · 0 评论 -
springboot工程快速搭建使用
springboot能够帮助我们快速创建一个独立的、生产环境可用的基于spring的应用。使用springboot开发非常简单快捷,很多互联网新人获取没有感受到这种强大的进步,就像现在人们对手机支付、手机聊天习以为常一样。在springboot出来之前,大家开发java的web项目,需要大量繁琐的搭建配置工作,例如要先搭建一个servlet容器比如tomcat,然后要按照一定格式创建一个javaee工程,配置web.xml文件、配置spring的各种xml文件,如果要访问...原创 2021-12-18 15:27:05 · 352 阅读 · 0 评论 -
一文了解springboot+micrometer+prometheus+grafana监控系统
本章我们以springboot+micrometer+prometheus+grafana为例,展示一套springboot监控系统的搭建使用。安装promotheus、prometheus gateway这次实例我使用gateway是因为我的springboot在本地启动、promethus在远程机器,远程机器不方便访问我的电脑ip。下载启动prometheus gatewaywget https://github.com/prometheus/pushgate...原创 2021-12-15 21:37:03 · 2538 阅读 · 0 评论 -
并发编程基础之-如何用数组实现阻塞队列?
ArrayBlockingQueue顾名思义,是基于数组实现的阻塞队列,阻塞队列可以用于缓冲任务,实现生产者消费者模式,例如线程池中的工作队列。那么怎么才能用数组实现阻塞队列呢?我们先从ArrayBlockingQueue的功能说起 首先它是一个队列,队列需要具备入队、出队的能力 由于是BlockingQueue,需要在队列已满时,对入队的请求进行阻塞,当队列有剩余空间时,释放入队请求;在队列为空时,需要对出队的请求进行阻塞,当队列中有元素时,释放出队请求; 由...原创 2021-12-15 21:26:29 · 1051 阅读 · 0 评论 -
最强线程池解析,线程池的这些细节你真的会了吗
本文整体整体结构ThreadPoolExecutor介绍首先我们要思考一下为什么要使用线程池。Java提供了多线程机制让我们能够同时运行多个任务,就像多个任务由多个人同时执行,而不是一个人依次执行这些任务。但是如果我们每次执行任务都创建一个线程,导致的问题有每次创建销毁线程都有一定的开销线程数量不好控制,过多的线程会导致内存占用过多,也可能超过操作系统的限制导致异常因此Java提供了默认的线程池,帮助大家解决这些问题,通过ThreadPoolExecutor,我们可以实现多种线程创建回收策略原创 2021-12-12 13:34:16 · 644 阅读 · 0 评论 -
设计和分析Java动态代理的技术实现
你了解Java中的动态代理的作用是什么吗?动态代理又有哪些实现方式,真正的实现原理是什么呢?掌握本章内容,在面试遇到aop如何实现的问题时,就不会只知道jdk代理接口和cglib集成子类、不知道真正的实现原理了。本文将会讲解动态代理技术能够解决的问题、如何自己设计实现动态代理、以及Java中是如何实现的以及一些开源框架中的典型应用。dynamic proxy是什么,可以用来做什么?通过dynamic proxy动态代理,我们可以在运行为接口创建实现类,或为特定类...原创 2021-12-12 13:26:08 · 416 阅读 · 0 评论 -
JVM实现原理分析之safepoint
safepoint又称为安全点,它是hotspot等JVM中的一个重要概念。下面我们分部分了解下safepoint是什么、safepoint的作用、safepoint是如何实现的以及作为开发者有哪些需要注意的地方。safepoint是什么JVM的主要任务是执行Java程序,而JVM运行时本身也是一个程序,但是为了执行Java程序JVM还有不少辅助工作,比如进行GC、JIT编译等等。一般会把运行在JVM上的用户Java程序称为mutator。以GC为例,JVM中一般...原创 2021-12-12 11:30:49 · 2534 阅读 · 0 评论 -
lambda表达式实现原理分析
本文将深入了解lambda表达式的实现原理和这样的实现方案的取舍权衡。Java为什么需要lambda表达式?能够提升代码简洁性、提高代码可读性。例如,在平时的开发过程中,把一个列表转换成另一个列表或map等等这样的转换操作是一种常见需求。 在没有lambda之前通常都是这样实现的。List<Long> idList = Arrays.asList(1L, 2L, 3L);List<Person> personList = new Ar...原创 2021-12-12 10:33:40 · 3415 阅读 · 2 评论 -
kubernetes系列02-本地安装kubernetes、部署springboot服务
本章我们在本地快速搭建一个kubernetes集群并且在上面部署一个springboot服务。kubernetes组件介绍kuberntes组件分为两部分,control plane(控制面)和worker node(工作节点)。control plane从名字可以看出负责控制整个系统。Control plane里面注意包含controller manager,scheduler, api server和etcd。etcd是存放kubernetes数据信息的...原创 2021-12-11 21:09:44 · 1196 阅读 · 0 评论 -
手把手教你构建、debug、开发Java虚拟机
目的Java虚拟机是Java开发者最常使用的平台,了解其中的运行原理可以帮助我们成为更好的开发者、遇到问题更快解决。对于很多虚拟机知识点,大多数人通常是通过看书或文章来了解相关知识的。这样的缺点是一个知识经过了两次信息理解传递,可能导致信息不准,那么为什么不自己去探究虚拟机的实现原理呢。了解自己常使用的工具的原理,便于更好的使用工具,就像更了解轮胎的赛车手能更好地驾驶汽车、更了解锅和菜刀的厨师可以练出更好的厨艺。而了解虚拟机的最直接的方式就是去构建、debug、开发它!...原创 2021-12-11 13:16:09 · 1310 阅读 · 0 评论 -
使用Logger
相比于以往的采用System.out.println();的调试方式,采用Loggershuchu原创 2014-08-14 22:09:41 · 531 阅读 · 0 评论 -
解决get方法传递URL参数中文乱码问题
应用一:解决tomcat下中文乱码问题(先来个简单的) 在tomcat下,我们通常这样来解决中文乱码问题:过滤器代码:package filter; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import wrapper.GetHttp转载 2015-03-17 10:13:53 · 4825 阅读 · 0 评论 -
Java并发编程实践读书笔记
进程是计算机的最小资源分配单位,线程是最小的CPU调度单位Java支持多线程,java.lang.Thread。用户可以轻松地使用多线程。多线程的好处有1. 充分利用多核处理器的能力2. 一个线程阻塞时其他线程可以继续工作,提高资源利用率3. 简化编程模型,一个线程代表一个任务,从开始到结束。4. 能够实现异步处理多线程带来的困难1. 线程间共享内存区,带来race原创 2015-08-15 18:28:00 · 524 阅读 · 0 评论 -
Netty ReferenceCounted
用于需要明确释放的对象当一个对象初始化完成后,它的reference count 是1, 调用retain()加1,调用release()减1并且如果reference count是0的话就释放。使用被释放掉的对象将会报错。原创 2015-09-02 15:46:32 · 910 阅读 · 0 评论 -
Netty源码分析之EventLoop相关结构分析
先来一个继承图,仅仅观察EventExecutor体系的轮廓 EventLoop > image2015-8-31 19:50:43.png" height="400" src="http://wiki.sankuai.com/download/attachments/340208009/image2015-8-31%2019%3A50%3A43.png?version=1&modific原创 2015-08-31 20:56:44 · 1797 阅读 · 0 评论 -
Reactor Pattern Explained
Handling concurrent events a Server receives is often thought of as a use-case for creating a separate thread for each IO event listener. Most programmers are tempted to use the famous socket loop f转载 2015-09-01 19:32:33 · 885 阅读 · 0 评论 -
Netty 源码分析之SimpleChannelInboundHandler
SimpleChannelInboundHandler非常常用,继承于ChannelHandlerAdapter,通过加入泛型可以使我们拦截特定类型的对象来进行处理,例如我们解码后得到的ThriftMessage对象,需要注意的是如果没有在构造器中明确指定,SimpleChannelInboundHandler会自动release对象。public abstract class SimpleCha原创 2015-09-02 16:15:18 · 4673 阅读 · 0 评论 -
wait和nofity
notify() 唤醒一个等待在this object的monitor的线程。多个线程的话,其中有一个会被唤醒。这个选择是任意的,可以自由实现。一个线程通过调用wait 方法之一在这个object的monitor上等待。被唤醒的线程一直等到当前线程放弃此object的monitor才能继续。被唤醒的线程将和其他可能的线程竞争同步此object的机会。例如,被唤醒的线原创 2015-09-10 17:47:46 · 1286 阅读 · 0 评论 -
责任链模式
chain of responsibility将要处理的对象在一个链式结构中传递处理。javaEE中的Filter就是一种chain of responsibility,每一个Filter进行相应的处理。Netty中的ChannelPipeline也是一种ChainOfResponsibility。每一个ChannelHandler对相应的message进行处理,可以选择处理向后传递也可以不传递。原创 2015-10-05 16:18:04 · 435 阅读 · 0 评论 -
double check locking
public boolean addItem(Item item) { if (itemList.size() maxSize) { lock.lock(); try { if (itemList.size() maxSize) { itemList.add(item); return true;原创 2015-10-06 11:42:24 · 460 阅读 · 0 评论 -
java虚拟机部分笔记
阅读《深入理解Java虚拟机》笔记第一章Java历史和各种Java虚拟机的历史第二章Java内存区域。Java虚拟机栈、程序计数器、成员变量表、heap 区、本地方法栈、方法区、直接内存等等。Java对象的创建和内存布局、对象的访问定位。OutOfMemory和StackOverFlow异常。第三章垃圾收集算法和垃圾收集器。判断对象是否存活有引用计数和可达性分析等算法,引用原创 2015-09-20 19:05:15 · 390 阅读 · 0 评论 -
KeeperException$UnimplementedException
KeeperException$UnimplementedException通常这是zookeeper客户端和服务端版本不一致造成的。原创 2016-02-14 20:12:39 · 6354 阅读 · 1 评论 -
线上问题排查
需要做好监控和报警,打日志要准确规范。性能类诊断uptimetopvmstat 1iostat 1dstatpidstat 1sar -n DEV 1free -m网络netstat -nltpnetstat -anptnetstat -ntp | grep ‘TIME_WAIT’ | awk ‘{print 5,5, 6}’ | awk -F ‘:’ ‘{print 1,原创 2016-09-18 13:47:20 · 710 阅读 · 0 评论 -
分析ClassLoader
Java中的ClassLoader先抛出几个问题类初始化 static{} 块会在什么时候执行Class在方法区内的结构不同类加载器加载一个类,类初始化块会被执行几次,不同ClassLoader加载的类存放在哪里,是否指向同一个Class实例类A触发了类B的加载,那么类B的加载器是什么如何实现热部署,即在运行时改变类的行为,或类替换Class.forName(name) 做了什么回答这些问题还是要参考JDK的代码实现,另外还要依靠Java语言规范和Java虚拟机规范本篇文章用类来泛指原创 2016-09-30 10:11:12 · 377 阅读 · 0 评论 -
Hibernate不能自动建表问题解决
hibernate.cfg.xml中dialect 配置方言为org.hibernate.dialect.MySQLInnodDialect原创 2014-08-26 12:52:53 · 919 阅读 · 0 评论