- 博客(40)
- 资源 (8)
- 问答 (2)
- 收藏
- 关注
原创 JUC-JMM三大特性
JMM(java内存模型,Java Memory model,简称JMM)本身是一种抽象的概念,并不真实存在,它仅仅描述的是一种约定或规范,通过这种规范定义了程序中(尤其是多线程)各个变量的读写访问方式,并决定一个线程对共享变量的写入以及如何变成另一个线程可见,关键技术点都是围绕多线程的原子性、可见性和有序性展开的。原则:JMM的关键技术点都是围绕多线程的原子性,可见性和有序性展开的。能干嘛?1、通过JMM来实现线程和主内存之间的抽象关系。2、屏蔽各个硬件平台和操作系统的内存访问差异,以实.
2021-09-29 23:57:08 356
原创 JUC-LockSupport
正常情况: public static void main(String[] args) { Thread t1 = new Thread(() -> { System.out.println(Thread.currentThread().getName() + " come in"); LockSupport.park(); System.out.println(Thread.currentThrea
2021-09-29 21:45:36 116
原创 JUC-await和signal
正常情况 public static void main(String[] args) { new Thread(()->{ lock1.lock(); try { System.out.println(Thread.currentThread().getName() + " come in"); condition.await();
2021-09-29 19:55:20 222
原创 JUC-wait和notify
Object类中的wait和notify方法实现线程等待和唤醒1、正常情况public class WaitNotifyDemo { static Object lock = new Object(); public static void main(String[] args) { new Thread(()->{ synchronized (lock) { System.out.println(Thr
2021-09-27 23:02:02 196
原创 JUC-线程中断
首先一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己停止。所以Thread.stop,Thread.suspend,Thread.resume都已经被废弃了。其次,在Java中没有办法立即停止一条线程,然而停止线程却尤为重要,如取消一个耗时操作。因此Java提供了一种用于停止线程的中断机制。中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的interrupt方法,该方法也仅仅是将线程对象的中断标识设为true。接着
2021-09-27 21:10:15 202
原创 JUC-死锁
死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉他们将都无法推进下去。如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因为争夺有限的资源而陷入死锁。public class DeadLockDemo { static String lockA = "lockA"; static String lockB = "lockB"; public static void main(String[] a.
2021-09-26 23:49:39 130
原创 JUC-可重入锁
隐式锁(即synchronized关键字使用的锁)可重入锁又叫递归锁,指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以获得锁使用并且不发生死锁,这样的锁就叫做可重入锁。 简单的来说就是: 在一个synchronized修饰的方法或代码块的内部调用本类的其他synchronized修饰的方法或代码块时,是永远可以得到的。Java中ReentrantLock和synchronized都是可重入锁,可重入锁能一定程度避免死锁。显式锁(即Lock)也有ReentrantLoc..
2021-09-26 22:38:58 237
原创 JUC-公平锁和非公平锁
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4] 示例 2: 输入:l1 = [], l2 = []输出:[] 示例 3: 输入:l1 = [], l2 = [0]输出:[0] 提示: 两个链表的节点数目范围是 [0, 50] -100 <= Node.val <= 100 ..
2021-09-26 20:52:39 195
原创 JUC-synchronized底层
1、 同步代码块public class LockByteCodeDemo { Object object = new Object(); public void m1() { synchronized (object) { System.out.println("===> hello sync"); } }}经过 javap -c xxx.class 反编译正常情况是一个monitorenter,两个mo
2021-09-26 20:06:26 88
原创 leetcode-合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4] 示例 2: 输入:l1 = [], l2 = []输出:[] 示例 3: 输入:l1 = [], l2 = [0]输出:[0] 提示: 两个链表的节点数目范围是 [0, 50] -100 <= Node.val <= 100 l1 和 l2 均按 非递..
2021-09-26 16:32:01 79
原创 leetcode-有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 示例 1:输入:s = "()"输出:true 示例 2:输入:s = "()[]{}"输出:true 示例 3:输入:s = "(]"输出:false 示例 4:输入:s = "([)]"输出:false 示例 5:输入:s = "{[]}"输出:true 提示: .
2021-09-26 15:45:23 99
原创 JUC-锁的现象及解释
线程操作资源类,8锁案例说明1、标准访问有ab两个线程,请问先打印邮件还是短信?class Phone { public synchronized void sendMail() { System.out.println("===>sendMail"); } public synchronized void sendSms() { System.out.println("===>sendSms"); }} p
2021-09-26 00:39:38 212
原创 JUC-悲观锁和乐观锁
悲观锁:适合写操作多的场景,先加锁可以保证写操作时数据正确。显示的锁定之后再操作同步资源。认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会为别的线程修改。synchronized关键字和Lock的实现类都是悲观锁乐观锁:适合多操作多的场景,不加锁能提升读操作的性能,是一种无锁算法。乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会加锁,只是在更新数据的时候去判断之前有没有别的线程更新的这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成
2021-09-25 22:37:36 202
原创 JUC-CompletableFuture的常用方法
1.获得结果和触发计算2.对计算结果进行处理thenApply()和handle()的区别就是异常的处理方式不同 public static void main(String[] args) { Integer result = CompletableFuture.supplyAsync(() -> { return 1; }, executor).thenApply((f -> { re
2021-09-25 22:13:35 194
原创 JUC-CompletableFutureNetMallDemo
模拟电商网站的比价需求package com.example.thymeleaf.controller;import java.util.Arrays;import java.util.List;import java.util.concurrent.*;import java.util.stream.Collectors;/** * @author jl * @since 2021/9/25 18:32 */public class CompletableFutureNetMa
2021-09-25 19:15:40 184
原创 JUC-CompletableFuture
FutureTask public static void main(String[] args) throws Exception { FutureTask<Integer> futureTask = new FutureTask<>(() -> { System.out.println(Thread.currentThread().getName() + " come in"); try { .
2021-09-23 22:58:19 255
原创 JUC-用户线程和守护线程
Java线程分为用户线程和守护线程,线程的daemon属性为true表示是守护线程,false表示是用户线程。守护线程是一种特殊的线程,在后台默默的完成一些系统性的服务,比如垃圾回收线程用户线程是系统的工作线程,它会完成这个程序需要完成的业务操作重点:当程序中所有用户线程执行完毕后,不管守护线程是否结束,系统都会自动退出设置守护线程,需要在start()方法之前进行用户线程未结束,程序一直运行用户线程结束,程序跟着结束 public static voi...
2021-09-23 20:55:02 113
原创 windowns免安装MongoDB
首先下载压缩包下载后解压并重命名,这里我重命名为 mongodb4.1.7 存放路径为 D:\ProgramFiles\mongodb4.1.7配置环境变量 新建 MONGODB_HOME 值为 D:\Program Files\mongodb4.1.7 添加到path中 %MONGODB_HOME%\bin在D:\ProgramFiles\mongodb4.1.7下新建文件和文件夹 data/db 用来存放数据 data/log/...
2021-09-23 14:31:30 1090
原创 JUC-进程、线程和管程
进程是资源分配的基本单位,每个进程都独享一块内存空间。线程指进程中的一个执行流程,一个进程可以包含多个线程。每个进程都需要操作系统为其分配独立的内存空间,而同一个进程中的多个线程共享这块空间,即共享内存等资源。管程:Monitor(监视器),也就是我们平时所说的锁。Monitor其实是一种同步机制,它能保证同一时间只有一个线程可以访问被保护的数据和代码。Jvm中同步是基于进入和退出监视器对象(Monitor管程对象)来实现的,每个对象实例都会有一个Monitor对象。Monitor对象会和Jav
2021-09-22 23:38:09 274
原创 Java数据结构之栈
public static void main(String[] args) { Deque<Character> stack = new LinkedList<Character>(); // 入栈 stack.push('a'); stack.push('b'); stack.push('c'); System.out.println("stack.size() = " + ...
2021-09-22 08:21:54 144
原创 使用ElementUI做树形懒加载
原始表结构查询全部一级目录,id=1的目录parent_id=0,即该条数据是顶级根目录 //根据数据id查询子数据列表 @ApiOperation(value = "根据数据id查询子数据列表") @GetMapping("findChildData/{id}") public Result findChildData(@PathVariable Long id) { List<Dict> list = dictService.fi.
2021-09-18 15:07:46 498
原创 vue-router切换路由组件重用
问题:vue-router导航切换 时,如果两个路由都渲染同个组件,组件的生命周期方法(created或者mounted)不会再被调用,组件会被重用,显示上一个路由渲染出来的自建解决方案:可以简单的在 router-view上加上一个唯一的key,来保证路由切换时都会重新触发生命周期方法,确保组件被重新初始化。修改 src/views/layout/components/AppMain.vue 文件如下:<template> <section class="app-.
2021-09-18 12:16:41 824
原创 Linux下安装宋体
windows的fonts在C:\Windows\Fonts最近工作用用到pdf在windows环境下没有出现中文乱码而在linux下出现中文乱码,打开pdf查看pdf编码,以及显示的编码,发现编码并没有对应。原因是使用的宋体和微软雅黑在linux环境下并没有安装。解决方法:1.到windows环境下将所需字体拷贝到linux下。(simsun.ttc(宋体),msyf.ttf(微软雅黑))2.到linux环境下创建目录mkdir -pv /usr/share/fonts/chinese...
2021-09-16 11:10:56 1628
原创 静态属性注入
直接用@Value()的方式不能注入值, 要用set注入@Componentpublic class OrderNoUtil { // B3230651812529 private static String[] yearCodes; private static Integer beginYear; @Value("${missyou.year-begin}") private void setBeginYear(Integer beginYear) {
2021-09-12 12:05:21 585
原创 优雅的判空处理
// 判断优惠券是否存在 this.couponRepository .findById(couponId) .orElseThrow(() -> new NotFoundException(40003)); // 判断优惠券对应的活动是否过期 Activity activity = this.activityRepository .fin...
2021-09-11 13:07:15 317
原创 JPA的连表查询
用jpql写 @Query("select c from Coupon c\n" + "join c.categoryList ca\n" + "join Activity a on a.id = c.activityId\n" + "where ca.id = :cid\n" + "and a.startTime < :now\n" + "and a.endTime &
2021-09-11 13:05:58 4275
原创 阿西的uniapp模板
第一:uniapp自己的 https://uniapp.dcloud.io第二:uview https://www.uviewui.com第三:uni.cool https://uni.cool-js.com/pages
2021-09-10 17:32:13 378
原创 Excel转PDF
本文将介绍在Java程序中如何将Excel工作簿转为PDF文档的,包括:将整个工作簿转为PDF 将指定工作表转为PDF使用工具:Free Spire.XLS for Java (免费版)Jar文件下载及导入:方法1:通过官网下载。下载后,解压文件,将lib文件夹下的Spire.Xls.jar文件导入Java程序;如下图:方法2:通过maven仓库导入,具体步骤可参考导入方法。Excel测试文档如下,包含两个工作表:【示例1】将整个工作簿转为PDFimport com
2021-09-10 16:37:35 172
原创 Gitee推送触发自动构建
java核心代码package com.webhook.controller;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bi
2021-09-08 21:04:03 333
原创 Nginx高级使用技巧
2、使用Nginx解决跨域问题当公司存在多个域名时,两个不同的域名相互访问就会存在跨域问题。或者在进行前端开发时,通常前端代码在本地启动,而后端代码会部署在一台专用的后端开发服务器上,此时前端去调用后端接口时,就会出现跨域问题。解决跨域的方法有很多,今天来说一下如何使用Nginx来解决跨域问题。假设后端服务器,是使用Nginx作为对外统一入口的,在Nginx配置文件的server块中增加如下配置:#允许跨域请求的域名,*代表所有add_header'Access-Control-..
2021-09-08 09:30:18 320
原创 SpringBoot 自动装配原理分析
什么是 SpringBoot2012年10月,一个叫Mike Youngstrom的人在Spring Jira中创建了一个功能请求,要求在Spring Framework中支持无容器Web应用程序体系结构,提出了在主容器引导Spring容器内配置Web容器服务。这件事情对SpringBoot的诞生应该说是起到了一定的推动作用。SpringBoot的诞生就是为了简化Spring中繁琐的XML配置,其本质依然是Spring框架,使用SpringBoot...
2021-09-07 16:07:29 322
原创 Redis缓存穿透、击穿、雪崩,解决方案
一、缓存穿透缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起id为-1的数据或者特别大的不存在的数据。有可能是黑客利用漏洞攻击从而去压垮应用的数据库。1. 常见解决方案对于缓存穿透问题,常见的解决方案有以下三种: 验证拦截:接口层进行校验,如鉴定用户权限,对ID之类的字段做基础的校验,如id<=0的字段直接拦截; 缓存空数据:当数据库查询到的数据为空时,也将这条数据进行缓存,但缓存的有效性设置得要较短,以免影响正常数据的缓存; publicSt...
2021-09-07 09:09:45 448
原创 MySQL 事务隔离级别
1. 理论MySQL 中事务的隔离级别一共分为四种,分别如下: 序列化(SERIALIZABLE) 可重复读(REPEATABLE READ) 提交读(READ COMMITTED) 未提交读(READ UNCOMMITTED) 四种不同的隔离级别含义分别如下: SERIALIZABLE ❝如果隔离级别为序列化,则用户之间通过一个接一个顺序地执行当前的事务,这种隔离级别提供了事务之间最大限度的隔离。 REPEATABLE READ ❝在可
2021-09-07 08:36:05 12892 4
原创 Springboot敏感字段脱敏
生产环境用户的隐私数据,比如手机号、身份证或者一些账号配置等信息,入库时都要进行不落地脱敏,也就是在进入我们系统时就要实时的脱敏处理。用户数据进入系统,脱敏处理后持久化到数据库,用户查询数据时还要进行反向解密。这种场景一般需要全局处理,那么用AOP切面来实现在适合不过了。首先自定义两个注解@EncryptField、@EncryptMethod分别用在字段属性和方法上,实现思路很简单,只要方法上应用到@EncryptMethod注解,则检查入参字段是否标注@EncryptField注解,有则将对应字
2021-09-06 15:02:11 2487
原创 深入剖析 MyBatis 核心原理(一)
完成 MyBatis 源码环境搭建之后,我再来带你分析一下 MyBatis 的架构。MyBatis 分为三层架构,分别是基础支撑层、核心处理层和接口层,如下图所示:MyBatis 三层架构图1. 基础支撑层基础支撑层是整个 MyBatis 框架的地基,为整个 MyBatis 框架提供了非常基础的功能,其中每个模块都提供了一个内聚的、单一的能力,MyBatis 基础支撑层按照这些单一的能力可以划分为上图所示的九个基础模块。由于资源加载模块的功能非常简单,使用频率也不高,这里我就..
2021-09-06 12:23:47 530
原创 非常全面的SpringBoot 参数校验
首先我们来看看什么是Validator参数校验器,为什么需要参数校验?为什么需要参数校验在日常的接口开发中,为了防止非法参数对业务造成影响,经常需要对接口的参数做校验,例如登录的时候需要校验用户名密码是否为空,创建用户的时候需要校验邮件、手机号码格式是否准确。靠代码对接口参数一个个校验的话就太繁琐了,代码可读性极差。Validator框架就是为了解决开发人员在开发的时候少写代码,提升开发效率;Validator专门用来进行接口参数校验,例如常见的必填校验,email格式校验,用户名必须位于6到1
2021-09-06 10:44:55 1541
原创 静态类变量的注入
@Componentpublic class GenericAndJson { private static ObjectMapper mapper; @Autowired public void setMapper(ObjectMapper mapper) { GenericAndJson.mapper = mapper; } public static xxx (){}}
2021-09-05 23:26:37 265
原创 spring data jpa方法命名规则
关键字 方法命名 sql where字句 And findByNameAndPwd where name= ? and pwd =? Or findByNameOrSex where name= ? or sex=? Is,Equals findById,findByIdEquals where id= ? Between findByIdBetween where id between ? and ? LessThan
2021-09-04 17:36:06 506
原创 jasypt配置文件加解密
在我们的开发中不可避免的需要使用到一些密码(数据库、redis等)开发和测试环境还好,但生产如果采用明文配置讲会有安全问题,jasypt是一个通用的加解密库,我们可以使用它。 <!-- 配置文件加解密 --> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-s
2021-09-03 15:21:32 1573
docker-compose-Linux-x86_64
2019-09-12
dubbo-admin.war(包含tomcat)
2018-06-10
swing复选框的问题swing复选框的问题
2018-07-27
怎么让计时器动画完整结束后继续循环计时器
2017-10-29
TA创建的收藏夹 TA关注的收藏夹
TA关注的人