Java学习
文章平均质量分 75
# Java学习
Allen Chou
这个作者很懒,什么都没留下…
展开
-
详解sleep( ) 和 wait( ) 的这 5 个区别以及Java中thread.yield()方法的使用
sleep(休眠) 和 wait(等待) 方法是 Java 多线程中常用的两个方法,它们有什么区别及一些该注意的地方有哪些呢?下面给大家一一分解。区别1:使用限制使用 sleep 方法可以让让当前线程休眠,时间一到当前线程继续往下执行,在任何地方都能使用,但需要捕获 InterruptedException 异常。try { Thread.sleep(3000L);} catch (InterruptedException e) { e.printStackTrace();原创 2021-09-28 23:42:48 · 396 阅读 · 0 评论 -
MySQL行锁、表锁、间隙锁详解
前言我们前几篇讲了索引是什么,如何使用explain分析索引使用情况,如何去优化索引,以及show profiles分析SQL语句执行资源消耗的学习。今天我们来讲讲MySQL的各种锁,这里存储引擎我们使用InnoDB;准备工作创建表 tb_innodb_lockdrop table if exists test_innodb_lock;CREATE TABLE test_innodb_lock ( a INT (11), b VARCHAR (20)) ENGINE I原创 2021-09-22 11:39:24 · 1747 阅读 · 0 评论 -
Java提高篇——Java 异常处理
异常的概念异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException的异常。异常发生的原因有很多,通常包含以下几大类:用户输入了非法数据。 要打开的文件不存在。 网络通信时连接中断,或者JVM内存溢出。这些异常有的是因为用户错误原创 2021-09-11 10:45:06 · 396 阅读 · 1 评论 -
Spring Security OAuth2.0系列之密码模式
ps:OAuth2.0的授权模式可以分为:授权码模式(authorization code) 简化模式(implicit) 密码模式(resource owner password credentials) 客户端模式(client credentials)密码模式(resource owner password credentials):密码模式中,用户向客户端提供自己的用户名和密码,这通常用在用户对客户端高度信任的情况;1.2 授权流程图官网图片:(A)用户访..原创 2021-09-06 22:20:49 · 3433 阅读 · 2 评论 -
Java提高笔记——静态代码块、构造代码块、构造函数以及Java类初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行。执行顺序优先级:静态块,main(),构造块,构造方法。构造函数public HelloA() {//构造函数}关于构造函数,以下几点要注意:1.对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的。2.构造函数的作用是用于给对象进行初始化。3.一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次。构造代码块...原创 2021-08-28 13:25:57 · 220 阅读 · 0 评论 -
slf4j日志系统的使用
LOG4J和SLF4J在通常系统中,日志功能使用了log4j+slf4j,对于这两者的区别不甚了解,通过实践,并深入源代码层次的分析,希望能够讲的清晰一些。基本原理在项目中使用到的jar包主要有log4j.jar , slf4j-api.jar,和slf4j-log4j.jar三个。简单来说,slf4j.jar主要是作为一个门面,简化记录日志的操作,log4j.jar是记录日志的具体实现,而slf4j-log4j.jar,是作为一个工厂,slf4j使用工厂来生产log4j的日志记录器。项目配原创 2021-08-09 17:08:41 · 472 阅读 · 0 评论 -
详解Java拦截器
Interceptors are used to implement cross-cutting concerns, such as logging, auditing, and security, from the business logic.In Java EE 5, Interceptors were allowed only on EJBs. In Java EE 6, Interceptors became a new specification of its own, abstracte.原创 2021-08-01 13:31:44 · 3743 阅读 · 1 评论 -
详解布隆过滤器的原理,使用场景和注意事项
在进入正文之前,之前看到的有句话我觉得说得很好:Data structures are nothing different. They are like the bookshelves of your application where you can organize your data. Different data structures will give you different facility and benefits. To properly use the power and acce原创 2021-07-26 10:42:35 · 226 阅读 · 0 评论 -
ThreadPoolExecutor组合使用synchronized关键字
未加synchronized关键字:package com.allen.thread;import java.util.concurrent.*;/** * @author :jhys * @date :Created in 2021/7/23 16:33 * @Description : */public class SynchronizedTest { public static void main(String[] args) { // 创建 Runn原创 2021-07-23 17:15:54 · 765 阅读 · 0 评论 -
详解并发编程的CAS问题 && Synchronized优化
volatile自己虽然不能保证原子性,但是和CAS结合起来就可以保证原子性了。CAS+volatile一起用就可以同时解决并发编程中的三个问题了,保证并发安全。CAS 是什么? CAS:比较并交换compareAndSet,它是一条 CPU 并发原语,它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子性的。 例: AtomicInteger 的 compareAndSet('期望值','设置值') 方法,期望值与目标值一致时,修改目标变量为设置值,期望值与原创 2021-07-21 11:25:13 · 320 阅读 · 0 评论 -
JDK1.8 新特性
Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。新特性Java8 新增了非常多的特性,我们主要讨论以下几个: Lambda 表达式− Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。 方法引用− 方法引用提供了非常有用的语法,可以直接引用已有Java类..原创 2021-07-20 15:13:40 · 315 阅读 · 1 评论 -
SSL / TLS 工作原理和详细握手过程
HTTPS 和 HTTP的区别显然,HTTPS 相比 HTTP最大的不同就是多了一层 SSL (Secure Sockets Layer 安全套接层)或 TLS (Transport Layer Security 安全传输层协议)。有了这个安全层,就确保了互联网上通信双方的通信安全,那么这个安全层是怎么工作的,SSL / TLS 握手过程又是怎样的呢?本文将对这些问题一一解答。1、SSL / TLS 以及 SSL / TLS 握手的概念SSL 和 TLS 协议可以为通信双方提供识别和认证通道..原创 2021-07-19 15:37:19 · 1436 阅读 · 1 评论 -
Java代理模式:静态、动态
一、代理模式介绍代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。简言之,代理模式就是设置一个中间代理来控制访问原目标对象,以达到增强原对象的功能和简化访问方式。代理模式UML类图举个例子,我们生活中经常到火车站去买车票,但是人一多的话,就会非常拥挤,于是就有了代售点,我们能从代售点买车票了。这其中就是代理模式的体现,代售点代理了火车站对象,提供购买车票的方法。二、.原创 2021-07-16 19:38:49 · 197 阅读 · 0 评论 -
Java使用Junit框架进行测试
在maven仓库中找到junit包,然后去除scope即可, <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency>在任意地方新建一个类,然.原创 2021-07-16 19:28:54 · 214 阅读 · 0 评论 -
Reactor模型概述 && Netty
目录Reactor模型概述单线程模型多线程模型主从多线程模型Netty模型(主要是主从多线程模型)第一个Netty服务服务端客户端四 Netty核心组件4.1 Channel4.2EventLoopGroup、EventLoop4.3 ChannelHandler4.4 ChannelPipeline4.5 Bootstrap4.6 Future4.7 组件小结五 缓存区-ByteBuf5.1 ByteBuf概述5.2 Byt...原创 2021-07-16 12:37:14 · 397 阅读 · 0 评论 -
详解静态内部类
如果用static来修饰一个内部类,那么就是静态内部类。这个内部类属于外部类本身,但是不属于外部类的任何对象。因此使用static修饰的内部类称为静态内部类。静态内部类有如下规则:静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。 外部类可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,也可以使用静态内部类对象访问其实例成员。package com.allen;/** * @author :jhys * @date :Created in 2021/7/15 17:2原创 2021-07-15 17:26:56 · 3039 阅读 · 0 评论 -
Netty笔记4-如何实现长连接
前面三章介绍了Netty的一些基本用法,这一章介绍怎么使用Netty来实现一个简单的长连接demo。 一个简单的长连接demo分为以下几个步骤:长连接流程创建连接(Channel) 发心跳包 发消息,并通知其他用户 一段时间没收到心跳包或者用户主动关闭之后关闭连接 看似简单的步骤,里面有两个技术难点: 如何保存已创建的Channel 这里我们是将Channel放在一个Map中,以Channel.hashCode()作为key 其实这样做有一个劣势,就是不.原创 2021-07-15 15:38:18 · 2601 阅读 · 0 评论 -
Netty入门教程3——Decoder和Encoder
Netty强大的地方,是他能方便的实现自定义协议的网络传输。在上一篇文章中,通过使用Netty封装好的工具类,实现了简单的http服务器。在接下来的文章中,我们看看怎么使用他来搭建自定义协议的服务器。要做到这点,第一步要做的,就是要自定义编码器和解码器,这就是我们这一章主要讲的内容。什么是Decoder和Encoder 在学习Decoder和Encoder之前,首先要了解他们在具体是个什么东西。在Netty里面,有四个核心概念,这个在第一篇文章提到的,他们的分别是: Channel,一个原创 2021-07-15 15:22:24 · 878 阅读 · 0 评论 -
Netty入门教程2——动手搭建HttpServer
在上一章中我们认识了netty,他有三大优点:并发高,传输快,封装好。在这一章我们来用Netty搭建一个HttpServer,从实际开发中了解netty框架的一些特性和概念。认识Http请求在动手写Netty框架之前,我们先要了解http请求的组成,如下图:HTTP Request 第一部分是包含的头信息 HttpContent 里面包含的是数据,可以后续有多个 HttpContent 部分 LastHttpContent 标记是 HTTP request 的结束,同时可能包含头的.原创 2021-07-15 15:10:06 · 301 阅读 · 0 评论 -
Netty入门教程——深入浅出Netty
什么是Netty?Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。Netty 是一个广泛使用的 Java 网络编程框架(Netty 在 2011 年获得了Duke's Choice Award,见https://www.java.net/dukeschoice/2011)。它活跃和成长于用户社区,像大型公司 Facebook 和 Instagram 以及流行 开源项目如 Infinispan, HornetQ, Vert.x,原创 2021-07-15 12:50:34 · 8539 阅读 · 0 评论 -
并发问题之synchronized关键字
之前我们讲过的AtomicInteger可以对“int类型的变量”做原子操作。但如果需要将“很多行代码”一起作为“原子性”执行——一个线程进入后,必须将所有代码行执行完毕,其它线程才能进入,可以使用synchronized关键字——重量级的同步关键字。AtomicInteger:只能解决一个变量的原子性synchronized:可以解决一段代码的原子性1.线程安全问题的概述(了解)2.线程安全问题的代码实现(重点)package com.allen.syn_dem...原创 2021-07-14 17:32:24 · 181 阅读 · 1 评论 -
并发问题之volatile关键字的使用
package com.allen.volatile_demo;/** * volatile解决可见性问题 * @author :jhys * @date :Created in 2021/7/14 16:25 * @Description : */public class MyThread extends Thread { public static volatile int a = 0; @Override public void run() { .原创 2021-07-14 16:39:08 · 127 阅读 · 0 评论 -
解析并发问题的非原子性问题(Atomic原子类)
1. 不使用Atomic原子类:原子:不可分割 100行代码是一个原子,线程执行100行代码不可以分开执行,要么都执行,要都不执行需求: 1.定义多线程共享的静态变量money 2.Thread-0线程把money的值增加10000 3.main线程把money的值增加10000 4.查看money的最终结果public class MyThread extends Thread{ //1.定义多线程共享的静态变量money public static int money =原创 2021-07-14 16:11:44 · 373 阅读 · 0 评论 -
ElasticSearch学习笔记
第1章 Elasticsearch概述01-开篇教学视频结构化数据非结构化数据半结构化数据02-技术选型Elasticsearch 是什么The Elastic Stack, 包括 Elasticsearch、 Kibana、 Beats 和 Logstash(也称为 ELK Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。Elaticsearch,简称为 ES, ES 是一个开源的高扩展的分布式全文搜索引原创 2021-07-13 16:39:14 · 464 阅读 · 5 评论 -
详解通过javap命令分析java汇编指令
新建IDEA的maven空项目,然后编码格式一定要选择UTF-8,不然反编译可能会导致错误。新建SynchronizeTest类,package com.allen;public class SynchronizedTest { public synchronized void method1() { System.out.println("hello"); } public void method2() { synchronized原创 2021-07-12 17:38:20 · 207 阅读 · 0 评论 -
IDEA多线程调试技巧
package com.allen;/** * @author :jhys * @date :Created in 2021/7/7 14:05 * @Description : */public class ThreadTest { public static void main(String[] args) { new Thread(() -> { System.out.println("1.aaa"); }, "aa.原创 2021-07-12 12:39:34 · 1066 阅读 · 2 评论 -
IDEA进入到ExecutorService里面进行调试的方法
在executor外面和里面的代码各打一个断点 ,然后点击resume program进入到具体线程的断点里面,原创 2021-07-12 12:33:34 · 1072 阅读 · 0 评论 -
详解垃圾回收CMS和G1算法
目录1 CMS收集器 安全点(Safepoint) 安全区域 2 G1收集器 卡表(Card Table) 3 总结 4 参考在开始介绍CMS和G1前,我们可以剧透几点:根据不同分代的特点,收集器可能不同。有些收集器可以同时用于新生代和老年代,而有些时候,则需要分别为新生代或老年代选用合适的收集器。一般来说,新生代收集器的收集频率较高,应选用性能高效的收集器;而老年代收集器收集次数相对较少,对空间较为敏感,应当避免选择基于复制算法的收集器。 在垃圾收集执行的时刻,应用程序需原创 2021-07-11 11:05:06 · 977 阅读 · 0 评论 -
详解MySQL联合索引
引言本文预计分为两个部分:(1)联合索引部分的基础知识在这个部分,我们温习一下联合索引的基础(2)联合索引部分的实战题在这个部分,列举几个我认为算是实战中的代表题,挑出来说说。正文基础讲联合索引,一定要扯最左匹配!放心,我不扯有的没的,几句话懂个大概就行!最左匹配所谓最左原则指的就是如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配,值得注意的是,当遇到范围查询(>、<、between、like)就会停止匹配。假原创 2021-07-10 17:31:24 · 2697 阅读 · 0 评论 -
hashCode和equals的重写问题
代码测试:重写hashcode,不重写equals:package com.allen;import java.util.HashSet;/* * 重写equals和hashCode方法 */public class RewriteHashCode2 { public static void main(String[] args) { //创建集合对象 HashSet<Person> hs = new HashSet<Person>(); ...原创 2021-07-09 16:15:11 · 194 阅读 · 0 评论 -
必须理解的Java中SPI机制
本文通过探析JDK提供的,在开源项目中比较常用的Java SPI机制,希望给大家在实际开发实践、学习开源项目提供参考。1 SPI是什么SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。整体机制图如下:Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。系统设计的各个抽象,往往有很多不同的实现方案,在面向的对象的设计里,一般推荐模块之间基于.转载 2021-07-09 12:51:14 · 207 阅读 · 0 评论 -
史上最全的Java命名规范[转]
每个公司都有不同的标准,目的是为了保持统一,减少沟通成本,提升团队研发效能。所以本文中是笔者结合阿里巴巴开发规范,以及工作中的见闻针对Java领域相关命名进行整理和总结,仅供参考。一、Java中的命名规范好的命名能体现出代码的特征,含义或者是用途,让阅读者可以根据名称的含义快速厘清程序的脉络。不同语言中采用的命名形式大相径庭,Java 中常用到的命名形式共有三种,既首字母大写的 UpperCamelCase ,首字母小写的 lowerCamelCase 以及全部大写的并用下划线分割单词的UPPER_转载 2021-07-09 09:47:24 · 1535 阅读 · 1 评论 -
Java 多线程之使用 Future 实现携带结果的任务
RunnableRunnable 是我们多线程开发过程中常用的接口。 Executor 框架使用 Runnable 作为其基本的任务表现形式。 Runnable 是一个有很大局限性的接口,run() 方法没有返回值并且不能抛出一个受检查的异常。@FunctionalInterfacepublic interface Runnable { public abstract void run();}Callable与 Runnable 不同,Callable 是个泛型参数化接口,它原创 2021-07-06 14:51:42 · 474 阅读 · 0 评论 -
微服务平台之全链路追踪
前言:随着微服务架构技术的普及和广泛在企业应用中落地,由于微服务架构本身的特性,架构由一系列相对独立的细粒度的服务组成,一个完整的业务逻辑调用请求的背后可能牵涉后端几个、几十个甚至上百个服务接口,每个服务可能是由不同的团队开发,使用了不同的编程语言,还有可能部署在不同的机器上,分布在不同的数据中心,对于这样的一个逻辑调用关系,如果在调用过程中发生问题,比如说调用失败,或者调用过程响应很慢,如何在这样一个分布式环境下快速定位问题所在、快速分析业务处理中的响应慢的瓶颈在哪?多个微服务之间存在调用关系,如何在原创 2021-07-02 11:26:20 · 481 阅读 · 2 评论 -
Git 使用技巧(结合IDEA)
使用git克隆指定分支的代码: 使用Git下载指定分支命令为:git clone -b分支名仓库地址 使用Git下载v.2.8.1分支代码,使用命令:git clone -b v2.8.1 https://git.oschina.net/oschina/android-app.git 如下图所示: 解释一下这个命令:-b表示要从分支下载,v2.8.1就是具体的某个分支的名称,https://git.oschina.net/oschina/android-app.git这是a.原创 2021-06-26 14:08:38 · 225 阅读 · 0 评论 -
Git 分支开发:规范指南
【摘要】 Git 是目前最流行的源代码管理工具。为规范开发,保持代码提交记录以及 git 分支结构清晰,方便后续维护,现规范 git 的相关操作。分支命名master 分支master 为主分支,也是用于部署生产环境的分支,确保master分支稳定性master 分支一般由develop以及hotfix分支合并,任何时间都不能直接修改代码develop 分支develop 为开发分支,始...Git 是目前最流行的源代码管理工具。为规范开发,保持代码提交记录以及 git 分支结构清晰,方便后续维护,.原创 2021-06-24 20:05:32 · 292 阅读 · 1 评论 -
Springboot单元测试流程
先引入依赖,junit测试框架, <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </d原创 2021-06-24 19:54:51 · 257 阅读 · 2 评论 -
dubbo里面模块新建springboot项目的注意事项
新建springboot项目之后,需要将项目变成maven依赖的才可以,原创 2021-06-16 19:22:00 · 106 阅读 · 0 评论 -
Lombok插件使用Slf4j日志打印功能
新建springboot项目,然后在pom.xml文件中引入lombok依赖, <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </depende原创 2021-06-15 20:17:09 · 2522 阅读 · 2 评论 -
Java实现List数据的自定义排序
比如按照User的年龄字段进行排序,package com.allen;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;/** * @author :jhys * @date :Created in 2021/6/13 23:54 * @Description : */public class User {原创 2021-06-14 00:00:17 · 1599 阅读 · 1 评论