Java
java
岁月呀
往事如风随风散
展开
-
Synchronized底层原理
一、线程安全问题缘起:count++是一个线程不安全操作,想要保证该操作线程安全,必须使用加锁机制,那么可以使用Synchronized关键字来实现加锁。1)synchronized修饰同步方法/** * 线程不安全的数值序列生成器 * @author whf * @create 2021/5/30 */public class UnsafeSequence { private int count; public synchronized void addCount()原创 2021-06-27 22:42:01 · 186 阅读 · 0 评论 -
volatile底层原理
1、测试代码public class VolatileDemo { public static void main(String[] args) { FlagThread flagThread = new FlagThread(); new Thread(flagThread).start(); for (; ; ) { if (flagThread.isFlag()) { System.ou原创 2021-06-27 22:18:37 · 237 阅读 · 1 评论 -
线程池源码解析
1、通过Executors创建线程池的四种方式1)创建单个线程的线程池该线程池使用单个线程在无界工作队列中执行任务,如果此单个线程在执行过程中由于故障而终止,则会分配一个新的线程来执行后续的任务。工作列队中的任务保证按顺序执行,并且保证在任意时刻都不会有多个任务处于活动状态。与newFixedThreadPool(1)返回的执行器不同,newSingleThreadExecutor()不允许重新配置线程数以使用多个线程。public static ExecutorService newSingleTh原创 2021-06-21 00:32:11 · 97 阅读 · 1 评论 -
Java应用系统架构演变
系统架构演变1)单体应用架构 web工程的所有模块(web层,service层,dao层)全部打包放到一个web容器中运行。 优点: (1)架构简单,开发成本低,周期短,适合小型项目。 缺点: (1)全部功能集成在一个工程中,对于大型项目不利于开发、拓展、维护。 (2)性能拓展只能通过扩展集群节点,成本...原创 2019-12-16 17:48:44 · 316 阅读 · 0 评论 -
Arrays.sort()的排序算法
Arrays.sort()有很多重载方法,这里以sort(int[] a)方法为例解析其中的排序算法。public static void sort(int[] a) { DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);}DualPivotQuicksort翻译过来就是双轴快排,进入里面的sort方法// Use Quic...原创 2020-04-11 22:31:00 · 1636 阅读 · 0 评论 -
hash冲突解决方案
1、链地址法HashMap中发生hash碰撞时使用的就是这种方法,会以链表方式存储hash冲突的元素。当链表过长的时候必须要扩容,否则查找性能随着链表的长度增长而下降。2、开放定址法当哈希碰撞时,按照算法的特定方式去往下寻找到下一个空的散列桶。如图77跟48碰撞,按照规定的算法往下查找到槽位为20是空的,所以77会放到20的槽位上。同理,插入78时,跟77发生哈希冲突,因为77移位占了他的位置,所以78也会往后找到空的槽位,因此放到了21槽。这种方式会可能会导致哈希聚集在一起,从而导致后续更频繁原创 2021-09-18 10:21:14 · 685 阅读 · 0 评论 -
pdf预览下载
1、有word模板可以先转成PDF,或者直接PDF模板下面是word转pdf在线网站http://www.pdfdo.com/doc-to-pdf.aspx2、下载Adobe Acrobat编辑pdf表单(aaa.pdf)可以在PDF里面添加文字域,图片域,后续可以根据域的名称来填充对应的内容1)注意用Acrobat打开PDF后,需要编辑表单(准备表单)形式,然后可以输入文字域等2)域的名称就是后续代码封装的map中的key,3)可以双击编辑域的文字大小,位置对齐,自动换行(选项卡选中多行)原创 2021-09-16 11:24:22 · 673 阅读 · 0 评论 -
java实现pdf预览和下载
1、引入依赖<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13.2</version> </dependency> <dependency>原创 2021-08-19 18:08:25 · 3533 阅读 · 0 评论 -
手写jdbc连接mysql
1. 引入mysql驱动包依赖<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.30</version></dependency>需求: 查询demo数据库中stu表所有记录并打印出来。2. 创建main方法如下packa原创 2020-07-02 14:13:46 · 469 阅读 · 0 评论 -
java中的深拷贝和浅拷贝
1、浅拷贝对源对象克隆到一个新的对象,源对象的引用类型按值副本传递,引用类型属性仍然引用之前的地址副本,所以对新对象修改引用类型属性时,源对象也会被修改。实现步骤: 1)实现cloneable接口 2)重写Object的clone方法2、深拷贝对源对象克隆到一个新的对象,新对象的基本类型和引用类型都会完整克隆一份新的,对新对象的引用类型修改不会影响到源对象。实现方式: 1)被克隆类和属性引用类型都实现cloneable接口并且重写Object的clone方法 2)被...原创 2021-02-03 11:46:47 · 284 阅读 · 1 评论 -
方法重载和方法重写
方法重写:子类重写父类方法(两同两小一大)1、两同(方法签名相同) 1)方法名相同 2)参数列表相同2、两小 1)子类方法返回值类型跟父类返回值类型相同或者父类返回值子类型 2)子类方法抛出异常类型跟父类抛出异常类型相同或者父类异常子类型3、一大 1)子类方法访问修饰符跟父类方法访问修饰符相同或者比父类方法更大权限访问修饰符方法重载:同一类中方法名相同,方法参数里列表不同(参数个数,参数类型,参数顺序)1、构造器重载2、方法重载方法重载只限定方.原创 2021-02-03 09:42:14 · 178 阅读 · 1 评论 -
重写equals方法,为什么一定要重写hashCode方法
一、为什么重写equals方法一定要重写hashCode方法?1、在使用了散列表数据结构的集合中(HashMap, HashSet, HashTable)在存取元素时先判断取到key对象的hashCode,然后跟集合容量取余后得到具体的位置,如果改位置上已经有值,再通过equals方法判断是否相等,相等则为同一个元素,否则为不同元素。2、第一点总结:为了能在散列表结构的集合中正常使用,那么判断两个对象是否相等,应该符合下面两个条件 1) hashCode相等,equals不一定相等。 ...原创 2021-02-02 15:13:38 · 520 阅读 · 1 评论 -
接口RT时间长优化思路
接口响应时间长,代表着整个链路某些地方出现性能问题1、对于分布式微服务架构,需要结合链路追踪等进行排查哪个环节出现性能瓶颈2、针对出现性能瓶颈的服务进行排查3、代码逻辑优化,减少数据查询次数(for循环查表),甚至减少缓存查询次数4、SQL优化,索引覆盖5、JVM调优...原创 2021-01-08 11:48:49 · 2287 阅读 · 0 评论 -
异步任务编排CompletableFuture
贴下异步编排随手写的测试代码,仅用于记录。/** * 异步编排测试,多任务编排时使用 * @author 86156 */public class AsynTest { public static void main(String[] args) throws ExecutionException, InterruptedException { // 1、异步执行,没有返回结果 CompletableFuture<Void> comple.原创 2020-12-14 01:12:03 · 435 阅读 · 0 评论 -
创建线程的方式
创建线程的方式1、继承Thread方式2、实现Runnable接口方式3、实现Callable接口并带返回值4、使用线程池直接上代码/** * 创建线程的方式 * @author 86156 */public class ThreadTest { public static void main(String[] args) throws ExecutionException, InterruptedException { // 1、继承Thread方式原创 2020-12-14 00:00:38 · 81 阅读 · 0 评论 -
重写equals和hashcode方法
import java.util.Objects;public class Person { private String name; private int age; @Override public boolean equals(Object o) { if (o == this) { return true; } if (o instanceof Person) { .原创 2020-08-22 18:44:46 · 105 阅读 · 0 评论 -
多线程基础整理
1. 进程和线程的区别 进程:一个应用程序运行在操作系统上称之为一个进程,每个进程都会有自己独立的内存空间。 线程:线程是进程中的一个执行任务,每个进程至少有一个线程,线程之间的栈空间是独立的,堆空间是共享的。 一个Java程序运行时就是一个进程,对应一个JVM实例,一个Java进程至少包含主线程和垃圾回收线程(后台线程)2. 并发和并行 并发:两...原创 2019-11-23 01:33:42 · 80 阅读 · 0 评论 -
Java NIO基础整理
NIO与BIO的区别NIO是jdk1.4引入的新的IO api,可以替代原来的标准java io(以下简称BIO,阻塞IO),NIO是面向缓冲区,基于通道的非阻塞io操作,BIO是面向流的阻塞性io操作。nio可以做到更加高效的文件读写操作。BIO NIO 面向流 面向缓冲区 阻塞 非阻塞 无 选择器 NIO三大核心概述...原创 2020-04-25 00:13:49 · 126 阅读 · 0 评论 -
多线程系列之线程池
为什么要用线程池线程频繁地创建和销毁的开销巨大,通过线程池来对线程进行统一的管理,以达到线程重用的目的。如何创建线程池先贴一段简单的代码,通过Executors可以创建线程池,而且创建的是只有一个线程的线程池。public class ThreadPoolTest { public static void main(String[] args) { Exe...原创 2020-04-19 12:37:57 · 87 阅读 · 0 评论 -
多线程系列之线程通信(生产者和消费者案例)
线程通信:当任务之间有关系的时候,就需要多个线程通信,互相协调一起完成工作,当然是在线程同步的基础上通信协调。1,一般用Object的wait/notify/notifyAll,让线程等待和唤醒实现线程之间的通信,而且上述方法只能由同步监听对象(共享资源)来调用,否则会报IllegalMonitorStateException异常。2,还可以通过ReentranLock,使用conditi...原创 2020-04-18 23:42:43 · 131 阅读 · 0 评论 -
SpringBoot配置CorsFilter解决跨域问题
1.跨域问题的由来由于浏览器的同源策略,不同源的客户端在没有明确授权的情况下,无法跨域访问另一个域的资源。同源策略:如果两个页面的协议,端口和主机都相同,则两个页面具有相同的源。下面是相对http://192.168.0.100/index.html为例同源检测示例:url结果http://192.168.0.100/page可以,只有URL不用http://1...原创 2020-03-14 19:16:33 · 1133 阅读 · 0 评论 -
Java实现树状结构数据的封装
需求:前端的树状目录需要后端响应树形结构json数据,所以需要后端将数据封装成树状结构数据,然后restful接口传递到前端。步骤一:创建树状结构对象/** * 树状对象封装类 */@Datapublic class TreeObject { private String id;//节点位移标识 private String isParent;//是否有子节点...原创 2020-01-19 17:56:50 · 2461 阅读 · 3 评论