Java
文章平均质量分 71
gonghaiyu
7年开发经验,2年项目管理经验。曾分别就职于某军工所,京东,美的等全球500强企业。
展开
-
princeton 本科cos318操作系统教程-2概述
Hardware of a typical computer硬件功能综述Software of a typical computertypical Unit os structureQuick review: how appliction is createdApplication: How it’s executedWhat an executable application looks likeMemory ManagementFile systemI/O Dev原创 2022-03-24 13:45:52 · 2645 阅读 · 1 评论 -
程序重启脚本
程序重启脚本#!/bin/bashtime=$(date "+%Y-%m-%d")JAR_NAME='credit_merchant.jar'JAR_PATH='/merchant'# 关闭运行的项目 PID=$(ps -ef | grep $JAR_NAME | grep -v grep | awk '{ print $2 }')if [ -z "$PID" ]then echo Application $JAR_NAME is already stoppedelse原创 2022-02-08 09:27:47 · 386 阅读 · 0 评论 -
重入锁ReentrantLock与AQS
重入锁ReentrantLock与AQS几个基本概念park与unpark阻塞与唤醒。这个在UnSafe章节已经详细讲解。park相当于将线程挂起。将当前执行线程上下文从CPU切换到缓存保存,将CPU让出执行其他任务。公平锁与非公平锁在执行lock操作时,公平锁会先去判断阻塞队列当中有没有线程,如果有,将该线程放入到队尾,所有等待线程先后执行。而非公平锁的操作是,某个线程尝试去获取锁的时候,先执行CAS看是否可以将状态为从0改为1,也就是说,非公平锁拿到锁的这个线程是随机的。公平锁的优点是等待锁原创 2021-06-10 15:54:51 · 79 阅读 · 0 评论 -
JVM(一)一文读懂Java编译全过程
一文读懂Java编译全过程Java文件编译过程包括两个阶段,第一阶段是在编译阶段编译成Java字节码的过程,有些书籍中叫前端编译器,如Oracle的javac编译器;第二阶段是在运行时,通过JVM的编译优化组件,对代码中的部分代码编译成本地代码,即JIT编译,如HotSpot中的C1、C2编译器。JVM整个编译过如下图所示。其中,编译状态有如下9种。//编译状态 public enum CompileState { INIT(0),//初始化 PARSE(1),//原创 2021-06-07 14:28:30 · 17829 阅读 · 1 评论 -
Java虚拟机
什么是虚拟机虚拟机是模拟执行某种指令集体系结构的软件。可分为三类。(1)进程虚拟机,如java虚拟机。(2)系统虚拟机,如visualbox,vm。(3)协设计虚拟机,如FPGA有人模拟了虚拟机协处理器(包括二进制翻译器以及TCache等部件单元)。...原创 2021-06-06 21:31:52 · 2268 阅读 · 0 评论 -
java图片合成工具类
图片合成工具类import lombok.extern.slf4j.Slf4j;import sun.misc.BASE64Decoder;import javax.imageio.ImageIO;import java.awt.*;import java.awt.geom.AffineTransform;import java.awt.image.BufferedImage;import java.awt.image.ColorModel;import java.awt.image.Wr原创 2021-06-05 17:35:39 · 1172 阅读 · 0 评论 -
java编码陷阱
java类型转换下面代码如果不加L,将导致int类型超范围,不会自动升级为Long,从而导致结果与实际不符。 public static boolean isValidity(String faceResultTime, int internalHour) { boolean valid = false; if (StringUtils.isNotEmpty(faceResultTime)) { valid = (System.current原创 2021-06-05 12:03:25 · 331 阅读 · 2 评论 -
RabbitMQ使用
RabbitSender类@Component@Slf4j@Scope("prototype")public class RabbitSender { @Autowired @Getter private RabbitTemplate rabbitTemplate; @Setter private String exchange; @Setter private String queue; public void sendMes原创 2021-06-03 22:34:44 · 137 阅读 · 1 评论 -
Feign内部调用时带上请求头(header)信息
Feign调用时,不同模块之间调用需要传递请求头,如a模块传递到b模块,可以在a模块采用以下方式。增加feign配置@Slf4j@Configurationpublic class FeignConfiguration implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { Map<String,String> hea原创 2021-04-21 14:08:51 · 8069 阅读 · 2 评论 -
软件架构场景-数据持久化层
本部分内容包括:(1)数据持久化层场景(2)缓冲层场景(3)基于常用组件的微服务场景及微服务踩坑(4)开发运维场景数据持久化层场景场景1:冷热分离订单功能,里面的主表有几千万的数据量,加上关联表,数据量达到上亿。因为业务员查询的基本是近期常用的数据,常用的数据量大大减少了,可以使用"冷热分离"。什么情况下使用冷热分离1.用户能接受新旧数据分开查询,比如有些电商网站默认只让查询 3 个月内的订单。2.数据走到终态后,只有读没有写的需求,比如订单完结状态。如何判断一个数据到底是冷数据还.原创 2021-02-24 15:38:42 · 892 阅读 · 0 评论 -
mybatis高级操作及源码分析(一)
Mybatis中使用注解 or xml 文件?注解使用姿势下面以Select注解为例。@Select 的本质还是 xml 文件的形式,有两种方式@Select注解和@SelectProvider。以下使用@Select注解。<pre>public interface UserMapper { Select("SELECT id, name FROM users WHERE id = #{id}") User selectById(int id);}</pre>原创 2021-02-18 15:25:13 · 344 阅读 · 2 评论 -
新项目上线注意事项
新项目上线时,检查项挺多的。在这里做下笔记。网络检查网络配置,主要包括NG反向代理,正向代理等。如果有用到gateway,则需要增加网关配置。用到前端vue框架,编译压缩时,注意base_url的上下文,需要与NG对应。配置文件检查线上的每个模块的配置文件。多次上线时发现配置文件书写不规范或者还是用测试环境的配置。数据库脚本检查线上数据库的编码和校对集。这里主要以mysql为例。字符集主要包括服务端字符集、客户端字符集和会话字符集。这里主要指服务端字符集。字符集和校对规则字符集是一原创 2020-05-18 00:48:54 · 1263 阅读 · 0 评论 -
(高级)ShardingSphere源码解析-微内核架构及分布式主键实现
如何快速阅读ShardingSphere源码ShardingSphere的目录结构如何快速把握 ShardingSphere 的代码结构呢?这是我们剖析源码时需要回答的第一个问题,为此我们需要梳理剖析 ShardingSphere 框架代码结构的系统方法。主要包括6大系统方法。基于可扩展性设计阅读源码ShardingSphere 在设计上采用了微内核架构模式来确保系统具有高度的可扩展性,并使用了 JDK 提供的 SPI 机制来具体实现微内核架构。在 ShardingSphere 源代码的根目录下原创 2021-01-02 00:47:29 · 1479 阅读 · 0 评论 -
(升级)分库分表下的事务、数据脱敏及配置管理
如何使用强一致性事务与柔性事务分布式环境下,事务就会变得比较复杂。这在分布式事务章节会进行详细分析。本章节只是针对ShardingShere中的分布式事务处理方案。ShardingSphere 中的分布式事务在 ShardingSphere 中,除本地事务之外,还提供针对分布式事务的两种实现方案,分别是 XA 事务和柔性事务。这点可以从事务类型枚举值 TransactionType 中得到验证:public enum TransactionType { LOCAL, XA, BASE}原创 2021-01-01 23:40:07 · 669 阅读 · 1 评论 -
Java封神之旅-深入理解Java中的同步器工具类
深入理解Java中的同步器工具类同步工具类主要分两种实现,第一种是基于AQS实现,如Semaphore、CountDownLatch和CyclicBarrier。另一种是同步工具跳过AQS,自己采用volatile state CAS + LockSupport.park/unpark实现的,Exchanger和Phaser是采用这种方式。AQS底层也是采用这种方式。Semaphore信号量属于syncronized的升级版。syncronized在同一个时刻只允许一个线程进入某段代码,但Semaph原创 2020-12-05 21:37:36 · 871 阅读 · 0 评论 -
Java反射常见使用方法
动态语言动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化。比如常见的JavaScript 就是动态语言,除此之外Ruby,Python 等也属于动态语言,而C、C++则不属于动态语言。从反射角度说JAVA 属于半动态语言。反射机制概念反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。反射可以在一个类运行的时候获取类的信息的机制,可以获取在编译期不可能获得的类的信息。对于任意一个对象,都能调用它的任意一个方法和属性。因为类的信原创 2020-12-01 21:17:38 · 563 阅读 · 0 评论 -
Java异常处理框架
What Is an Exception?The term exception is shorthand for the phrase “exceptional event.”The call stack.The runtime system searches the call stack for a method that contains a block of code that can handle the exception. This block of code is called an原创 2020-12-01 20:28:25 · 984 阅读 · 0 评论 -
(Java并发基础)各种各样的锁
锁分为以下 7 大类别的特性偏向锁/轻量级锁/重量级锁;可重入锁/非可重入锁;共享锁/独占锁;公平锁/非公平锁;悲观锁/乐观锁;自旋锁/非自旋锁;可中断锁/不可中断锁。偏向锁/轻量级锁/重量级锁第一种分类是偏向锁/轻量级锁/重量级锁,这三种锁特指 synchronized 锁的状态,通过在对象头中的 mark word 来表明锁的状态。偏向锁如果自始至终,对于这把锁都不存在竞争,那么其实就没必要上锁,只需要打个标记就行了,这就是偏向锁的思想。一个对象被初始化后,还没有任何线程来获取原创 2020-07-26 13:36:50 · 116 阅读 · 0 评论 -
java io 高级
In the main body of this book, it’s important to understand the following topics:• Buffer handling• Kernel versus user space• Virtual memory• Paging• File-oriented versus stream I/O• Multiplexed I/O (readiness selection)Buffer HandlingFigure 1-1 sh原创 2020-11-29 21:18:20 · 142 阅读 · 0 评论 -
第二十四章 死抠synchronized关键字
synchronized关键字关于多线程,主要问题就是如何控制对共享资源的访问。如何保证多个线程访问的数据是一致的,即保证数据的一致性成为多线程编程必须要解决的问题。在Java中,如果多个线程对一个方法或者代码块中的共享变量进行访问,可以使用synchronized关键字。下面通过一个实例开始对synchronized关键字进行分析。在这个例子中,有一个同步类方法、一个同步实例方法、同步类代码块方法,同步实例代码块方法。//javac -d .\classes SyncrhonizedTest.java原创 2020-11-29 14:50:17 · 281 阅读 · 0 评论 -
第二十三章 Java线程与操作系统关系
Java线程与操作系统关系线程是比进程更轻量级的调度执行单位,线程可以把一个进程的资源分配和执行调度分开,各个线程可以共享进程资源(内存地址、文件I/O等),又可以独立调度。并发不一定依赖于线程,PHP中是多进程并发。但Java并发大多数情况下与线程有关。线程是CPU调度和分配的基本单位,也就是说开辟线程需要系统内核来完成。Java线程的实现方式主流的操作系统都提供了线程实现,Java语言则提供了在不同硬件和操作系统平台下对线程操作的统一处理,每个已经执行start()且还未结束的java.lang.原创 2020-11-29 11:36:28 · 655 阅读 · 0 评论 -
第二十章 引用是个什么鬼
引用是个什么鬼一切都是对象一切都是对象,但操作对象的都是指针或引用。在C++中,我们通过指针操作对象。而在Java中,我们把指针称为"引用",通过引用来操作对象。Java中的垃圾回收机制也是根据"引用"来判断是否需要回收。所以,理解"引用"对理解Java语言很重要。在Java中,引用主要有两种。对于基本类型变量( 字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double),赋值运算直接修改为新值,原来的数据被覆盖。对于引用类型变量,赋值运算只原创 2020-11-29 01:34:57 · 192 阅读 · 0 评论 -
第十八章 volatile的前世今生往后
volatile的前世今生往后volatile关键字volatile关键字是JUC包的基础,所有的原子类型都以volatile作为修饰,因它不需要引起线程上下文切换和调度,比sychronized关键字更加轻量级的同步机制。volatile中在大厂面试中经常会问到。主要的考察点有:JUC包中利用volatile中的地方有哪些?为啥要用volatile?结合JMM内存模型考察多线程下volatile的变量工作流程。给出一个场景,怎么使用volatile关键字。CPU Cache模型因CPU与原创 2020-11-29 01:29:46 · 255 阅读 · 1 评论 -
第九章 Executor框架及几种线程池原理剖析
Executor框架及几种线程池原理剖析为什么要用线程池在程序中创建和销毁对象是很费时间的,在Java中更是如此。虚拟机需要跟踪每个线程中每个对象的生命周期,以便在适当的时候进行垃圾回收。所以,提高程序总体效率的一个手段就是尽可能减少创建和销毁对象的次数。特别是一些很耗资源的对象创建和销毁,在这种背景下就产生了"池化技术"。线程池就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候不需要创建而是从池中获取线程,使用完毕也不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。线程池有以原创 2020-11-29 01:13:15 · 277 阅读 · 1 评论 -
第7章 枚举、注解、泛型的底层原理
枚举、注解、泛型的底层原理枚举、注解、泛型的底层原理枚举、注解、泛型的底层原理枚举的底层原理枚举类基础枚举常量枚举体定义Enum与单例注解底层原理动态代理实现注解与反射测试注解反射与代理静态代理动态代理Jdk动态代理的实现Cglib方法的动态代理对比泛型语法糖与编译解语法糖源码分析Java中语法糖举例泛型和类型擦除自动装箱、拆箱附录枚举的底层原理枚举类基础枚举类enum可以看成是一个普通的class,它们都可以定义一些属性和方法,不同之处是,enum不能使用extends关键字继承其他类,因为enu原创 2020-11-29 00:55:37 · 207 阅读 · 0 评论 -
第五章 聊一聊Java的几个常用关键字
聊一聊Java的几个常用关键字Java 8中的关键字如下图所示,其中const和goto保留。true,false,null,var看起来像关键字,但是其实是字面量(字面量是基本类型值的源代码体现,如true,false是boolean类型的字面量,var则是JDK10中局部变量推断中的字面量),字面量也不能在代码中用它们作为标识符。下面分别谈论下Java面试中常问的关键字。类相关的关键字classclass是对某种类型对象定义变量和方法的原型。每个class在编译时会生成.class文件。在运原创 2020-11-28 22:58:43 · 202 阅读 · 0 评论 -
分布式事务原理及落地方案
分布式事务主要有两种处理方式,一种是通过强一致性来保证的,一种是通过最终一致性来保证。他们典型的方案有:强一致性最终一致性一致性理论分布式事务的目的是解决应用垂直拆分后的分库数据的一致性的,所以,应用的垂直拆分规则对分布式事务的影响非常大。如果某个节点宕机,就无法像单机一样保证事务的ACID。业界CAP理论告诉我们,为了保证分布式环境下事务的一致性,需要将数据一致性、系统可靠性和分区容忍性放一起考虑。CAP理论在分布式系统中,一致性(Consistency)、可用性(Availability原创 2020-11-07 16:27:56 · 250 阅读 · 0 评论 -
Java应用调优实战-实战案例与高频面试点
缓冲区如何让代码加速文件读写流接下来,我会以文件读取和写入字符流为例进行讲解。Java 的 I/O 流设计,采用的是装饰器模式,当需要给类添加新的功能时,就可以将被装饰者通过参数传递到装饰者,封装成新的功能方法。下图是装饰器模式的典型示意图,就增加功能来说,装饰模式比生成子类更为灵活。在读取和写入流的 API 中,BufferedInputStream 和 BufferedReader 可以加快读取字符的速度,BufferedOutputStream 和 BufferedWriter 可以加快写入原创 2020-11-01 11:26:11 · 1134 阅读 · 4 评论 -
Java应用调优实战-工具支持
哪些资源,容易成为瓶颈当系统存在短板时,就会对性能造成较大的负面影响,比如当 CPU 的负载特别高时,任务就会排队,不能及时执行。而其中,CPU、内存、I/O 这三个系统组件,又往往容易成为瓶颈,所以接下来我会对这三方面分别进行讲解。CPU首先介绍计算机中最重要的计算组件中央处理器 CPU,围绕 CPU 一般我们可以:通过 top 命令,来观测 CPU 的性能;通过负载,评估 CPU 任务执行的排队情况;通过 vmstat,看 CPU 的繁忙程度。具体情况如下。top 命令 —— CP原创 2020-10-29 16:57:26 · 311 阅读 · 1 评论 -
Maven基本操作
1.从Maven远程存储库下告诉 Maven 来获得 Java.net 的依赖,你需要声明远程仓库在 pom.xml 文件这样:pom.xml <repositories> <repository> <id>java.net</id> <url>https://maven.java.net/content/repositories/public/</url> </repository><原创 2020-10-22 17:06:59 · 657 阅读 · 0 评论 -
JDK无限制的密码策略
无限制的密码策略背景: 因为美国的出口管制限制,Java发布的运行环境包中的加解密有一定的限制。比如默认不允许256位密钥的AES加解密,解决方法就是修改策略文件。Oracle官方网站提供了JCE无限制权限策略文件的下载:下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt。如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security下覆盖原来文件,记得先备份。如果安装了JDK,将两个jar文件放到%JDK原创 2020-10-18 22:02:31 · 2706 阅读 · 0 评论 -
搭建maven仓库推送jar包maven配置
<?xml version="1.0" encoding="UTF-8"?><settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apa原创 2020-10-11 15:00:18 · 611 阅读 · 0 评论 -
手把手教你内网环境搭建百度地图
百度地图内网访问方案现在有一个项目,需要实现内网访问百度地图。上网查阅资料发现有以下两种思路:1、离线百度地图api以及一些资源(控件、logo)2、离线百度地图api以及一些资源(控件、logo、瓦片图)区别就在于需不需要把瓦片图下载到本地。方案2的难点在于:a.下载瓦片图,需要特定的下载程序,一般都是付费的,否则不全或有水印;b.命名瓦片图,在1.3版本中,需要依靠xyz的值来确定瓦片图的路径,有些博客有涉及。综上所述,采用方案1比较简单,它的整体思路是:只把api对应的js文件和一些必需的资原创 2020-10-09 23:01:11 · 11025 阅读 · 11 评论 -
Java应用调优实战-性能优化方法论
衡量指标有哪些?1. 吞吐量和响应速度分布式的高并发应用并不能把单次请求作为判断依据,它往往是一个统计结果。其中最常用的衡量指标就是吞吐量和响应速度,而这两者也是考虑性能时非常重要的概念。像我们平常开发中经常提到的,QPS 代表每秒查询的数量,TPS 代表每秒事务的数量,HPS 代表每秒的 HTTP 请求数量等,这都是常用的与吞吐量相关的量化指标。在性能优化的时候,我们要搞清楚优化的目标,到底是吞吐量还是响应速度。 有些时候,虽然响应速度比较慢,但整个吞吐量却非常高,比如一些数据库的批量操作、一些原创 2020-10-02 21:23:21 · 679 阅读 · 0 评论 -
(Java并发基础)Future类的使用
在并发编程中,我们经常用到非阻塞的模型,在之前的多线程的三种实现中,不管是继承thread类还是实现runnable接口,都无法保证获取到之前的执行结果。通过实现Callback接口,并用Future可以来接收多线程的执行结果。Callable接口public interface Callable<V> { V call() throws Exception;}可以看出它也是一个 interface,并且它的 call 方法中已经声明了 throws Exception,前面原创 2020-09-30 09:49:13 · 1188 阅读 · 0 评论 -
Spring的核心功能及执行流程
Spring BeanSpring Bean的注册方式XML配置文件的注册方式Java注解的注册方式Java API的注册方式注意:xml的优先级会高于注解的优先级,即如果配置了xml和注解两种注册方式,则通过xml注册的属性值会覆盖注解设置的属性值。XML 配置文件注册方式<bean id="person" class="org.springframework.beans.Person"> <property name="id" value="1"/>原创 2020-07-28 17:02:52 · 630 阅读 · 0 评论 -
MyBatis三剑客
MyBatis Generator几种生成代码方式汇总java代码+配置文件生成纯Java代码+模板生成命令行+XML生成java代码+配置文件生成编写配置文件<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "ht.原创 2020-09-27 11:11:15 · 213 阅读 · 0 评论 -
(基础)Java面向对象和数据结构(1)(CS 2110)
本课程全部来自于康奈尔大学CS 2110课程,主要介绍以下内容:面向对象编程、推理复杂问题测试,关于正确性的推理程序开发算法复杂度,分析算法数据结构,链表,树,hash表,图等编程范式:递归,并行执行Is CS2110适合你?不需要的Java知识大概30%的人知道Java,其他人知道Matlab,Python必须:熟悉一些编程语言,比如CS1110(Python基础)和CS1112(Matlab基础)我们假设你不知道Java!如果你知道Java,前3周的课程可能相对你比较容.原创 2020-09-26 16:27:00 · 312 阅读 · 0 评论 -
JVM内核及原理、诊断与优化 - 锁
介绍一下传统的锁是重量级的,monitorenter有可能让线程在OS层面挂起。JVM内核及原理、诊断与优化 - 锁9.1 线程安全9.2 对象头9.3. 偏向锁9.4. 轻量级锁9.5. 自旋锁9.6. 偏向锁,轻量级锁,自旋锁总结9.7. 减少锁的持有时间9.8. 减小锁粒度9.9. 锁分离9.10. 锁粗化9.11. 锁消除9.12. 无锁9.1 线程安全多线程网站统计访问人数(1)使用锁,维护计数器的串行访问与安全性多线程访问ArrayListpublic class TestT原创 2020-09-22 21:11:32 · 107 阅读 · 0 评论 -
第二十六章 ThreadLocal原理及生产中遇到的坑
ThreadLocal原理及生产中遇到的坑什么是ThreadLocalThreadLocal实现原理ThreadLocal使用场景ThreadLocal常用示例ThreadLocal 实现原理静态内部类的实例化ThreadLocal结构ThreadLocal主要方法剖析几个概念主要方法initialValue方法set方法清除脏的entry替换脏的entryrehash方法get方法remove方法thread.exit()ThreadLocal内存泄漏问题总结2.4 为什么使用弱引用?什么是Thre.原创 2020-09-22 00:11:53 · 638 阅读 · 0 评论