Java
楚瑞涛
这个作者很懒,什么都没留下…
展开
-
Spring Boot优雅关闭之Redisson中ExecutorService的关闭流程源码追溯
起因起源:在使用Redisson实现分布式定时调度的过程中,遇到一个非常奇怪的问题:经过一些操作后,调度器会报一个莫名其妙的错误,status is shutdown,经过多次观察发现是在rancher平台重新发布Spring Boot项目后就会报这个错误,怀疑和Spring Boot优雅关闭有关系,所以进行一个追溯确认的过程。报错信息:Reids数据:然后翻阅RScheduledExecutorService 的方法,发现shutdown方法代码执行的 lua 脚本和目前...原创 2020-11-25 12:00:57 · 4329 阅读 · 3 评论 -
利用Redisson实现分布式延时任务调度功能
定时任务定时任务是在编码世界中经常遇到的问题,比如定时备份数据库、定时刷新缓存等,可以通过Linux定时任务完成,也可以通过框架如Spring完成,但是在分布式场景中传统单机可以完成功能就不太行了,所以需要借助其他工具来实现任务调度的功能场景:在一些订单场景中,用户下单后会锁定一些资源,然后用户非正常退出(没有触发取消订单操作),导致订单资源占用无法释放的问题。借助工具:redisson分布式服务中的分布式调度任务服务(Scheduler Service)代码关单任务定时执..原创 2020-11-23 16:52:34 · 3344 阅读 · 3 评论 -
Java JDK内置实用工具——监视工具、故障排除工具
监视工具JConsoleJConsole 图形用户界面是一种符合 Java 管理扩展 (JMX) 规范的监视工具。JConsole 使用 Java 虚拟机 (Java VM) 的广泛检测来提供有关在 Java 平台上运行的应用程序的性能和资源消耗的信息。使用方法本地使用jconsole命令:监视本地运行的所有 Java 应用程序,JConsole 可以连接到这些应用程序。使用jconsole PID命令:监视指定PID的Java应用程序。获取java PID的方法:通过任务管理原创 2020-05-26 10:41:39 · 301 阅读 · 0 评论 -
Java HashMap和HashTable的区别
UML结构图从这个图中我们可以看到:HashMap和HashTable都实现了Map接口,但是HashMap继承了AbstractMap,而HashTable继承了Dictionary类。其实HashMap还有一个内部类Node,Node实现了Map.Entry<K,V>,HashMap存储的每一个节点都是一个Node对象。区别HashMap 线程安全 允许...原创 2020-04-07 17:10:36 · 167 阅读 · 2 评论 -
Java 聊聊Spring框架AOP和IoC
Spring框架Spring 框架是当前主流的 Java 应用程序开发框架。Spring使Java编程对每个人来说都更快、更简单、更安全。Spring对速度、简单性和生产力的关注使它成为世界上最流行的Java框架。spring 的优点?降低了组件之间的耦合性 ,实现了软件各层之间的解耦 可以使用容易提供的众多服务,如事务管理,消息服务等 容器提供单例模式支持 容器提供...原创 2020-03-23 18:27:36 · 420 阅读 · 0 评论 -
Java 细聊JVM之堆与GC
JVM内存体系结构堆体系结构一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行,堆内存分为三部分:Young Generation Space 新生区 Young/New Tenure generation space 养老区 ...原创 2020-03-22 17:29:45 · 342 阅读 · 0 评论 -
Java 细聊JVM之类加载器
什么是JVMJVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM所处的位置JVM是运行在操作系统之上的,它与硬件没有直接的交互,但是它可以通过 native 本地方法调用硬件接口JVM体系结构类加载器负责加载 class 文件,...原创 2020-03-11 19:16:32 · 171 阅读 · 0 评论 -
Java 死锁的概念及排查
什么是死锁死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。互斥条件:资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直...原创 2020-03-10 20:07:23 · 177 阅读 · 0 评论 -
Java 由浅入深聊聊线程池及原理
Java 由浅入深聊聊线程池及原理原创 2020-03-10 18:02:33 · 205 阅读 · 0 评论 -
Java 线程创建的方法之Callable接口
Java 创建多线程的四种方式继承 Thread 类 实现 Runnable 接口 实现 Callable 接口 利用线程池今天咱们来重点聊聊第三种实现方式,Callable 接口。Callable接口Callable 接口是从 JDK1.5 以后提供的一种线程创造方法,是多线程包 java.util.concurrent 包中的,用于多线程环境。创建线程Callabl...原创 2020-03-09 16:54:55 · 241 阅读 · 0 评论 -
Java 聊聊反射机制和动态代理
1.反射反射就是Reflection,Java的反射是指程序在运行期可以拿到一个对象的所有信息,并且可以执行其方法。适用于程序在运行期,对某个实例一无所知的情况下,如何调用其方法。反射引入的类不需要使用 import 关键字进行导入。1.1优点因为是动态编译,所以灵活度高,运行时动态加载。1.2缺点执行效率低。因为反射机制都是 JVM 实现的。 破坏了三大特性中的继承的特性。...原创 2020-03-04 22:01:30 · 256 阅读 · 0 评论 -
Java 聊聊CharSequence及其子类
CharSequenceCharSequence是char值的可读序列。 该界面提供统一的,只读访问许多不同类型的char序列。实现类其中最重要的也是最常用的就是 String、StringBuilder和StringBuffer。这三字子类都是用来处理字符串的,但是他们之间还有有一定差别的。String从源码上来看是实现了 Serializable 序列化接口、Co...原创 2020-03-04 11:23:05 · 839 阅读 · 0 评论 -
Java 爬虫基础|图片下载
随着越来越多的人会网络爬虫技术,但是有的公司不想要数据随随便便爬取或者敏感数据防止泄露,就产生了许许多多的反爬虫策略:判断请求头、token、ip地址检测等等。所以简单的网页可以使用 Jsoup 工具进行爬取,但是一些网站由于安全性,防止爬取,所以我们需要手动添加一些请求头等信息,所以下面给大家介绍一款新的工具HttpClientHttpclient 可以用来提供高效的、最新的、功能丰富的...原创 2020-02-27 17:45:13 · 192 阅读 · 0 评论 -
Java 爬虫入门
网络爬虫网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。简单的说就是爬取网页,解析,处理。需要使用到 Jsoup 工具来做 http 请求:Jsoup 工具下载尝试爬取一下起点中文网中的小说信息,确定要爬取页面...原创 2020-02-27 16:51:04 · 298 阅读 · 0 评论 -
Java 面试题-生产者和消费者模式(传统到进阶)
什么是生产者和消费者?就是你去吃包子,包子铺就是生产者,你就是消费者。简单的说就是生产者负责造,消费者负责耗。需要解决的问题生产者过度生产问题 通知机制 消费者过度消费 避免产生死锁传统写法...原创 2020-02-27 13:47:55 · 1614 阅读 · 0 评论 -
Java 谈谈阻塞队列
什么是阻塞队列阻塞队列,顾名思义,首先它是一个队列,其次他是可以阻塞的。阻塞简单的说就是在后面等着排队。而一个阻塞队列在数据结构中所起的作用大致如图所示:当阻塞队列是空时,从队列中获取元素的操作将会被阻塞。 当阻塞队列是满时,往队列中添加元素的操作将会被阻塞.。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,知道其他线程从队列中移除一个或者多个元素或者全清空队列后使...原创 2020-02-23 21:14:15 · 226 阅读 · 0 评论 -
Java CountDownLatch|CyclicBarrier|Semaphore
CountDownLatchCountDownLatch 是在 java 1.5 被引入。CountDownLatch 是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行。CountDownLatch 主要有两个方法,当一个或多个线程调用 await 方法时,调用线程会被阻塞。其他线程调用countDown 方法计数器减1 (调用 countDown 方法时线程...原创 2020-02-23 10:42:45 · 114 阅读 · 0 评论 -
Java 独占锁|共享锁|互斥锁
独占锁又叫写锁,指该锁只能被一个线程所持有。Java 中 ReentrantLock 和 synchronized 都是独占锁。共享锁又叫读锁,指该锁可以被多个线程所持有。Java 中 ReentrantReadWriteLock 其读锁是共享锁,其写锁是独占锁。读锁的共享锁可保证并发读是非常高效的,读写,写读,写写的过程是互斥的。互斥锁在访问共享资源之前对进行加锁操作,在...原创 2020-02-22 21:57:15 · 921 阅读 · 1 评论 -
Java 公平锁|非公平锁|可重入锁|递归锁|自旋锁
公平锁是指多个线程按照申请锁的顺序来获取锁类似排队打饭,先来后到非公平锁是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情况下,有可能造成优先级反转或者饥饿现象关于两者区别公平锁Threads acquire a fair lock in the order in which they requested it.公平...原创 2020-02-22 17:46:08 · 211 阅读 · 0 评论 -
Java 聊聊集合类不安全及读写分离技术
Collection 应该是大家在编程中使用的最多的,在单线程编程中一般不会出现问题,但是到了多线程的时代,可就不一定了。List示例代码/** * 集合类不安全的问题 * ArrayList */public class ContainerNotSafeDemo { public static void main(String[] args) { List<...原创 2020-02-19 16:14:25 · 1378 阅读 · 0 评论 -
Java CAS 看这一篇就够了
CAS既 compareAndSwap,比较并交换。如果线程的期望值和物理内存的值相等,本次修改成功;如果不相等则失败。例子:import java.util.concurrent.atomic.AtomicInteger;/* CAS:compareAndSwap,比较并交换 */public class CASDemo { public static void main(...原创 2020-02-18 21:15:37 · 517 阅读 · 0 评论 -
Java 单例模式最完美的写法
单例模式是设计模式的中的一种。所谓单例模式,就是就是整个系统中对象仅此一个,不会有重复的对象生成。1. 懒汉式顾名思义,就是比较懒,当你使用的我现场去创建对象。// 单例对象class SingleObject{ private static SingleObject instance; //构造方法私有化 private SingleObject(){ Syst...原创 2020-02-17 16:47:31 · 596 阅读 · 0 评论 -
Java 谈谈什么是 volatile
随着互联的飞速发展,互联网公司也越来越高,并发多线程,内存管理,JVM调优等成为面试必问题。1. 什么是 volatile?volatile 是 Java 虚拟机提供的轻量级的同步机制。他的三大特性:保证可见性 不保证原子性 禁止指令重排1.1 可见性在解释可见性之前需要先看一下什么是 JMM?JMM(Java 内存模型 Java Memory Model,简称 ...原创 2020-02-15 17:20:47 · 1613 阅读 · 0 评论 -
JAVA HashMap 和 HashSet 的区别
什么是HashMap? HashMap是实现Map<K,V>接口的一个实体类,它对键值做了一对一的映射关系,当然里面键值不能重复。Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。映射顺序 定义为迭代器在映射的 collection 视图上返回其元素的顺序。某些映射实现可明确保证其顺序,如 TreeMap 类;另一些映射实...原创 2018-03-28 16:28:28 · 18119 阅读 · 4 评论 -
Java 中 == 和 equals 的区别
想要搞清楚这个问题,首先得先知道栈和堆的区别栈:栈首先是一片内存空间,用于存储局部变量(定义在方法中的变量、for 循环内的变量)。当方法或语句先被加载后才能定义局部变量,所以方法最先进的是栈内存。变量被定义后都有自己的定义域,一旦变量离开了作用域,变量就会被释放。所以栈内存更新的速度很快,因为局部变量的周期比较短。堆:堆也是一片内存的空间,用于存储的是数组和对象,凡事通过 new 关键字生...原创 2018-12-04 20:53:31 · 132 阅读 · 0 评论 -
我对 static 关键字一无所知
static 关键字相信大家在初学编程语言的时候都会遇到,但是你真的了解它吗?先给大家一个例子,请你观察他的运行结果public class Test { //静态代码块 static { System.out.print("we "); } //构造代码块 { System.out.print("are "); } //构造方法 public Test() {...原创 2019-07-08 14:33:33 · 122 阅读 · 0 评论 -
try finally 与 return 的微妙关系
众所周知,Java中异常处理机制try-catch-finally,try用来捕获异常,然后交给catch语句进行处理,finally用来替补,无论try中与catch中的遇到什么问题,fincally语句中都会被执行。但是先给大家一个开胃菜:public class ReturnFinally { public static void main(String[] args) { ...原创 2019-10-07 20:33:11 · 164 阅读 · 0 评论 -
多线程通信实现交替执行 | 面试题
题目:在 Java 中使用两个线程交替输出 1A2B3C.....26Z题目很简单,但是做起来并不容易,这主要考的是多线程通信相关的知识点。怎么让多个线程之间进行通信,怎么知道多个线程之间的状态信息。当时看到这道面试题,我的脑海中只有一个解题思路,就是 synchronized(对象) 去锁定线程,使其拿到锁对象后才能正常运行,代码如下:public class ThreadMessag...原创 2019-10-19 11:52:18 · 204 阅读 · 0 评论 -
谈谈 Java Virtual Machine 以及 GC
JVM(Java Virtual Machine),Java 虚拟机,它是一种标准,通过这种标准它不需要依赖硬件,通过 jvm 虚拟的硬件操作实现“一次编译,多次运行”。JVM 总共分为五个模块,分别是:类装载器子系统、运行时数据区、执行引擎、本地方法接口和垃圾收集模块大家可以看看下面这个图,把重点的部分都已经呈现出来了。类装载子系统:负责将字节码文件加载到运行时数据区中,完...原创 2019-11-03 16:09:56 · 234 阅读 · 0 评论 -
JAVA笔试题 Statement、PreparedStatement和CallableStatement
题目:下面有关jdbc statement的说法错误的是?A. JDBC提供了Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程B. 对于PreparedStatement来...原创 2020-02-12 19:27:46 · 1577 阅读 · 1 评论 -
Spring 事务属性的种类
事务属性的种类: 传播行为、隔离级别、只读和事务超时传播行为传播行为定义了被调用方法的事务边界。传播行为意义PROPERGATION_MANDATORY表示方法必须运行在一个事务中,如果当前事务不存在,就抛出异常PROPAGATION_NESTED表示如果当前事务存在,则方法应该运行在一个嵌套事务中。否则,它看起来和 PROPAGATION_REQUIR...原创 2020-02-12 20:00:43 · 186 阅读 · 0 评论 -
Java 引用对象 == 和equals及内存分布
直接上代码public class Four { long width; public Four(long l) { width = l; } public static void main(String arg[]) { Four a, b, c; a = n...原创 2020-02-12 20:54:42 · 154 阅读 · 0 评论 -
Java JUnit 测试 和 TDD
JUnit什么是 JUnit ?JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。 JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。简单的说就是用来进行测试的,判断方法结果执行是否正确,是用来简化替代测试。...原创 2020-02-14 16:06:40 · 531 阅读 · 0 评论