- 博客(140)
- 收藏
- 关注
原创 Scanner next()和nextLine()的区别
测试完整字符串:哈哈 呵呵 笑嘻嘻scanner.next():读取输入内容中第一个没有空白符的内容。在它之后的读取操作(next或nextLine)会继续读,直到流中的内容被读完。比如第一次读的是"哈哈",第二次读的是"呵呵"。scanner.nextLine():读取输入内容中整行内容。示例1:nextLine+nextLine Scanner input = new Scanner(System.in); System.out.println("请输入字符串
2021-10-05 12:27:15 1259
原创 让我云里雾云的volatile
volatile 简介volatile关键字是Java虚拟机提供的的最轻量级的同步机制。它作为一个修饰符出现,可以用来修饰变量。它有什么作用呢?它修饰的是变量,可以保证变量对所有线程的可见性,禁止指令重排,但是不能保证原子性。现代计算机的内存模型计算机执行程序时,指令是由CPU处理器执行的,而打交道的数据是在主内存当中的。ps:由于计算机的存储设备与处理器的运算速度有几个数量级的差距,总不能每次CPU执行完指令,然后等主内存慢悠悠存取数据吧,影响协作效率。所以现代计算机系统加入一层读写.
2021-09-07 20:57:11 438
原创 一款idea插件,让接口测试效率提升N倍
idea 中的:HTTP Client,这款工具挺好用的,主要优点:1、若想测试一个接口,只需要几行代码2、运行特别容易3、可以切换各种环境的请求地址创建一个 springboot 项目核心实现IndexControllerpackage com.example.demo;import org.springframework.web.bind.annotation.*;import org.springframework.web.multipart.MultipartFil
2021-08-28 14:40:16 4449 1
原创 表单数据提交时的编码类型
application/json和application/x-www-form-urlencoded都是表单数据提交时的两种编码类型。EncTypeenctype 属性规定在请求发送到服务器之前,应该如何对表单数据进行编码。默认地,表单数据会编码为 "application/x-www-form-urlencoded"。查看请求的编码方式application/x-www-form-urlencoded对应的数据格式为键值对,比如 “name=xxx”application/jso
2021-08-28 14:34:09 944
原创 form-data、x-www-form-urlencoded、raw、binary
1、form-data就是http请求中的multipart/form-data,用于处理表单数据。可以上传一般的键值对参数,也可以上传文件参数。当上传的是文件参数时,Content-Type会显示文件类型;content-disposition,会显示上传文件的一些具体信息。由于有boundary作为边界分隔符,所以multipart/form-data既可以上传文件参数,也可以上传键值对参数。它采用了键值对的方式,所以可以上传多个文件。2、x-www-form-urlencoded.
2021-08-28 14:31:09 980
原创 数据同步神器Canal
简介canal是阿里巴巴的一个开源项目,基于java实现,已经在很多大型的互联网项目生产环境中使用,包括阿里、美团等都有广泛的应用,是一个非常成熟的数据库同步方案,基础的使用只需要进行简单的配置即可。canal是通过模拟成为mysql的slave的方式,监听mysql的binlog日志来获取数据,binlog设置为row模式以后,不仅能获取到执行的每一个增删改的脚本,同时还能获取到修改前和修改后的数据,基于这个特性,canal就能高性能的获取到mysql数据数据的变更。canal分为serv
2021-08-28 14:08:19 1687
原创 date类型的数据转json时,自动转为时间戳的问题
方式一:在对应的实体类的get方法上定义一个注解@JSONField(format = "yyyy-MM-dd HH:mm:ss")方式二:使用另一个API方法JSON.toJSONStringWithDateFormat(parseObj,dateformat,SerializerFeature.WriteDateUseDateFormat)
2021-08-15 15:43:45 527
原创 二维码本地OK,服务器乱码问题
问题:二维码标题中文乱码(服务器),本地是OK的解决方案:服务器上缺少字体,需要添加windows中相应的字体!(C:\Windows\Fonts\simsun.ttc)如果是docker,可以在dockerfile文件中添加字体ADD指令,将宿主机字体文件从容器内拷贝到宿主机即可!(宿主机+容器都需要)ADD 宿主机文件的全路径 docker容器下的文件夹路径示例:ADD ./simsun.ttc /usr/share/fonts/chinese/simsun.ttc...
2021-08-15 15:40:38 349
原创 RocketMQ Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:2.17:check...
问题分析:根据报错提示,应该是maven-checkstyle-plugin插件的问题。解决方式一:找到插件maven-checkstyle-plugin:2.17,添加跳过属性。修改pom.xml方式二:找到插件maven-checkstyle-plugin:2.17对应的插件标签,注释掉。清除原target目录,重新编译即可!...
2021-07-17 12:37:10 461 1
原创 cat << EOF 什么意思?
cat <<EOF 什么意思?cat命令表示查看,而cat <<EOF命令表示将进行输入,直到以EOF终止符来结束输入(最后的新行)。EOF必须写在一行的头部,前面不能有制表符或者空格。如果结束符EOF前面有制表符或者空格,则EOF不会被当做结束符,只会被视为继续输入的状态。简单的理解,就是随意输入一堆字符,当输入EOF的时候才真正结束。如果还想写入到某个文件,可以 cat <<EOF > 某个文件,每次写入文件都会覆写而不是追加写。这种是.
2021-07-13 21:35:50 15451
原创 多线程:通信
线程通信:多个线程之间进行信息交流与传递。常用于公共数据的通信。下面我们分别演示一下单消费者、单生产者,多消费者、多生产者的通信。在演示之前,强调一下:多个线程访问同一个类的不同synchronized方法时, 都是串行执行的 ! 就算有多个cpu也不例外 ! synchronized方法使用了java的内置锁, 即锁住的是方法所属对象本身。也就是说,多个线程不能同时(并发)访问同一个同步方法,也不能同时(并发)访问不同的同步方法。消费者、生产者(1-1)示例1.面包类public c
2021-07-10 12:44:18 171
原创 多线程:使用同步措施解决并发引起的可见性问题
解决线程并发问题的常用两种方法:1.volatile关键字2.synchronized关键字下面主要介绍下synchronized关键字这种方式。多线程可见性问题,具体可以参看另一篇文章:点击这里另外,插一嘴,多个线程访问同一个类的不同synchronized方法时, 都是串行执行的 ! 就算有多个cpu也不例外 ! synchronized方法使用了java的内置锁, 即锁住的是方法所属对象本身。什么意思呢?就是多个线程不能同时(并发)访问同一个同步方法,也不能同时(并发)访问不同
2021-07-10 12:17:57 245 1
原创 多线程:并发引起的可见性问题及常用方法小结
现象:一个线程修改了共享变量的值,另一个线程却不可见。示例:缓存类public class MyCache { public String key; public String value; /** * 标记cache是否为空 */ public boolean isEmpty = true; @Override public String toString() { return "MyCache{" +
2021-07-08 21:47:43 334
原创 mongo 修改嵌套属性
mongo修改级联属性时,仅使用$匹配时,查询条件必须匹配到唯一的一条记录,不能是多条记录。否则会出现以下错误:The positional operator did not find the match needed from the query.位置操作符没有从查询中找到所需的匹配项。$.xx.下标可以修改某条嵌套属性数据。$[]可以修改所有嵌套属性数据。比如下面的例子,可以某一个嵌套内容:db.getCollection('sys_tenant').update( {"xx...
2021-06-23 10:43:09 1855
原创 redis 缓存穿透、雪崩、击穿
缓存穿透概念缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。“穿透”的意思就是穿过redis进入到DB。下图是一个简单的缓存实现:...
2021-05-29 13:28:09 216
原创 java 并发之synchronized
前言在多线程开发中,我们经常看到synchronized(this)、synchronized(*.class)、synchronized(Object o)这些玩意。它们都围绕synchronized关键字,用于同步方法或同步代码块,解决线程安全问题,保证在同一时刻最多只有一个线程执行某段代码。一、synchronized(this)...
2021-05-29 13:18:37 188
原创 java 锁的分类
一、简介锁,是一种同步机制,用于在多线程中实现对资源的控制,解决并发问题。二、锁的种类公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁上面包含了8种锁的名词,这些分类并不全是指锁的状态,有的是指锁的特性,有的是指锁的设计。下面,将对每个锁的名词进行解释。在介绍之前,说一下饥饿现象如果一个线程的cpu执行时间都被其他线程抢占了,导致得不到cpu的分配执行,这种情况就叫做“饥饿”。解决饥饿现象的..
2021-05-29 13:08:27 1039 3
原创 java 可重入锁、不可重入锁
可重入锁广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁。我的理解就是,某个线程已经获得某个锁,可以无需等待而再次获取锁,并且不会出现死锁(不同线程当然不能多次获得锁,需要等待)。简单的说,就是某个线程获得某个锁,之后可以不用等待而再次获取锁且不会出现死锁。常见的可重入锁Synchronized和ReentrantLock 都是可重入锁。可重入锁的释放同一个线程..
2021-05-29 12:57:01 620 1
原创 mysql 乐观锁、悲观锁
前言悲观锁与乐观锁本质上不是数据库中具体的锁,而是人们定义出来的概念,可以理解为一种思想,是处理并发问题的常用手段(方法)。可以将数据库中的行锁,表锁,排他锁,共享锁根据这种锁思想进行分类。乐观锁的实现方式一般来说,有两种:版本号和时间戳。使用数据版本(Version)记录机制,这是乐观锁最常用的一种实现方式。通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,就对此version值加一。当提交更新的时.
2021-05-29 12:52:24 169
原创 mysql 行级锁
前言锁,是执行多线程时用于限制资源访问的一种同步机制。行级锁数据库锁根据锁的粒度可分为行级锁、表级锁、页级锁。行级锁是MySQL中粒度最小的一种锁,表示只对当前操作的数据行进行加锁。粒度越小,实现的成本也就越高。INNODB的行级锁有共享锁(S锁)和排他锁(X 锁)两种。共享锁允许所有事务读取某些数据,不允许任何事务修改这些数据。排他锁允许当前事物删除或更新或读取某些数据,其他事务不能删除或更新或读取这些数据。另外,MYISAM引擎只支持表级锁,而INNODB引擎能够支持行级锁。...
2021-05-29 12:43:16 1188
原创 mysql 读锁和写锁
读锁:又称共享锁(S锁)。若事务T对数据对象A(某一资源)加上S锁,则事务T可以读A但不能修改A。其它事务也只能读A但不能修改A。并且,其他事务只能再对A加S锁,不能加X锁,除非T释放A上的S 锁。简单的说,自己只能读,别人也只能读。写锁:又称排他锁(X锁)、独占锁。若事务T对数据对象A(某一资源)加上X锁,事务T可以读A也可以修改A。其它事务不能读A也不能修改A。并且,其他事务不能再对A加任何锁(共享锁或排他锁),直到T释放A上的锁。简单的说,自己可读可写,别人不可读不可写。行级锁操作加排它锁
2021-05-23 18:03:23 2209
原创 mysql 表级锁之读锁、写锁
语法lock tables tablename read/write或lock table tablename read/write表级锁-读锁当MySQL的一个进程为某一个表开启读锁之后,其他的进程包含自身都没有权利去修改这个表的内容。但是,所有的进程是可以读这个表的内容的,只是不能实现更新。另外,其它进程只有等待该进程释放读锁之后,才可以更新数据,否则,其他的进程一直处于等待状态。简言之,开启读锁,所有进程拥有读权限,没有写权限,关闭读锁,所有进程拥有读写权限。表级锁..
2021-05-23 17:54:55 795
原创 mysql 全局锁、表级锁、行级锁
一.什么是锁锁,其实就是计算机在执行多线程或线程时用于并发访问同一共享资源时的一种同步机制,MySQL中的锁是在服务器层或存储引擎层实现的,保证了数据访问的一致性与有效性。二、全局锁、表级锁、行级锁1.全局锁全局锁就是对整个数据库实例加锁,MySQL提供了一个加全局读锁的方法,命令是flush tables with read lock(FTWRL)。当你需要将整个库处于只读状态(不能写入)的时候,可以使用这个命令,之后线程的以下语句就会被阻塞:数据更新语句(数据的增删改),数据定义语句
2021-05-23 17:53:52 337 1
原创 mysql 可重复读的实现原理
简述MySQL默认的事务隔离级别是可重复读,即:事务A在读到一条数据之后,此时事务B对该数据进行了修改操作并提交,那么事务A再读该数据,依然还是原来的内容。 额,MySQL可重复读是如何做到的?其实使用的是一种叫MVCC的控制方式 ,即Mutil-Version Concurrency Control(多版本并发控制),类似于乐观锁的一种实现方式。实现细节InnoDB在每行记录后面保存两个隐藏的列,分别保存了这个行的创建时间(版本号)和行的删除时间(版本号)。这里存储的并不是实际的时间值,而
2021-05-23 17:46:30 3914 1
原创 mysql 主从同步
什么是mysql主从复制?MySQL主从复制的意思就是将数据从一个MySQL服务器的主节点复制到N个从节点(一个或多个)。一般,主节点负责写数据,从节点负责读数据,同时保证主节点的数据及时同步到从节点。主从复制可以做到实时热备数据热备和冷备?热备:在数据库运行的情况下,备份数据。冷备:在数据库关闭的情况下,备份数据。Mysql的复制模式?异步复制是MySQL默认的复制模式。该模式的好处是不用一直访问master,从而对master造成压力。该模式的坏处是主库写入binlog日
2021-05-23 17:40:53 152 1
原创 mysql 基础(持续更新)
1.where条件转移sum(if(startTime>xxx and endTime>xxx,money,0)): 满足条件的部分进行求和count(if(startTime>xxx and endTime>xxx,1,null)):满足条件的部分进行计数sum(if(startTime>xxx and endTime>xxx,CASE WHEN ... THEN ...,0)): 满足条件的部分进行分类求和2.json_extract()获取json数
2021-05-23 17:39:25 80
原创 java 枚举的使用
实现原理在使用关键字enum创建枚举类型并编译后,编译器会为我们生成一个相关的类,这个类继承了Java API中的java.lang.Enum类。也就是说通过关键字enum创建枚举类型,在编译后事实上也是一个类类型而且该类继承自java.lang.Enum类。(可以看看反编译的结果)结论:从反编译的代码可以看出编译器确实帮我们生成了一个Day2类,而且该类继承自java.lang.Enum类。除此之外,编译器还帮我们生成了7个Day2类型的实例对象,分别对应枚举类中定义的7个枚举元素。同时生
2021-05-23 17:37:33 74
原创 windows mongo副本搭建集
data目录:C:/Program Files/MongoDB-master/Server/4.2/dataC:/Program Files/MongoDB-slave1/Server/4.2/dataC:/Program Files/MongoDB-slave2/Server/4.2/datalog目录:C:/Program Files/MongoDB-master/Server/4.2/log/mongod.logC:/Program Files/MongoDB-slave1/Server/
2021-05-14 21:06:03 193
原创 mysql 存储过程之游标的使用
#如果存在此存储过程,则删除drop PROCEDURE if EXISTS dg;#创建存储过程create PROCEDURE dg(in c_id int,in c_xz int,in c_cq int)begin#声明变量DECLARE finish int DEFAULT 0; #数据遍历结束标志DECLARE var_id int;DECLARE var_date varchar(15);DECLARE var_to_work_time varchar(10);DECLARE
2021-05-14 21:03:25 1568
原创 java List集合分批处理
List集合分批处理public List<OpSectionBerthSensorStatus> selectOpSectionBethSensorStatusBatchProcess(List<String> dataList) { if (null != dataList && dataList.size() > 0) { List<OpSectionBerthSensorStatus> allLi
2021-05-01 20:30:58 399
原创 Git 常用命令
git stash:暂存当前本地所有修改git stash pop:恢复最近一次的暂存,同时清除该暂存记录git stash list:查看暂存记录列表
2021-05-01 20:28:57 91
原创 java List集合之subList()引发的ConcurrentModificationException异常
对List进行subList()操作或subList().clear()连缀操作时,可能会出现以下异常:ConcurrentModificationException产生的原因:子集合先引用原集合,引用之后再对原集合进行了操作(改变了原集合的结构),此时操作使用子集合就会出现该异常!解决方案:将子集合拷贝到新集合中,然后直接操作使用该新集合,不要去引用原集合,除非能保证引用的原集合在引用之后不再操作(改变结构)! public static void main(String[] .
2021-04-21 22:17:55 544
原创 Linux ifconfig无法显示IP
方法一:1.ifupens33 启动网卡(我的是ens33,以自己的网卡名称为准)出现Determining IP information for ens33... done. 说明网卡启动成功。方法二:1.vim /etc/sysconfig/network-scripts/ifcfg-ens33 (我的是ens33,以自己的网卡名称为准)找到 ONBOOT=no,并将no改为yes2.重启网络服务:service network restart可能出现的问题:Determ.
2021-04-18 17:32:37 476
原创 nginx 配置解析
nginx常见正则匹配符号^: 开始符。$:结束符。.*: .表示匹配任意字符,*表示匹配n次(n>=0)。\. :斜杠用来转义,\.匹配 . 这个符号本身。(值1|值2|值3|值4):或匹配模式,比如(jpg|gif|png|bmp)可以匹配jpg或gif或png或bmp。nginx的几个匹配模式location = /uri:精确匹配,只有完全相同才能匹配。location ~ regexPattern :区分大小写的正则匹配。location ~* regexPatte..
2021-04-17 20:17:56 250
原创 java 常用API(持续更新)
1.字符串转换为ListList<String> list = Arrays.asList(str.split(","));2.List转换为字符串String str = StringUtils.join(list, ",");
2021-03-28 19:17:36 110
原创 java 透明图片添加水印
对应非透明图片,在上传保存后,保存的图片和原图不一样,背景变成黑色的了。经过一波三折,终于折腾出来了。下面给出实现:public static void addWaterMark(InputStream input, File file) throws Exception { Color color = new Color(255, 200, 0, 118); Font font = new Font("微软雅黑", Font.ITALIC, 15); .
2021-03-16 21:57:27 517
原创 linux 内存不够用
top命令查看内存占用情况,按m切换显示方式,按M按内存排序dd if=/dev/zero of=/tmp/newdisk bs=1M count=1024 mkswap -f /tmp/newdisk swapon /tmp/newdisk free -m dd if=/dev/zero of=/tmp/newdisk bs=1M count=2048 dd if=/dev/zero of=/tmp/newdisk2 bs=1M count=2048 mkswap -
2021-03-14 13:12:12 131
原创 springboot 支付宝支付
实现步骤1. 登陆支付宝开放平台支付宝开放平台链接:https://open.alipay.com右侧直接支付宝扫码支付就完事了。登陆之后需要填写入驻信息,如果是个人开发者的话可以切换一下信息,默认为系统服务商,可自行切换到开发者身份。如下图所示。2. 进入沙箱环境登陆成功后,如下图所示,页面往下拉,找到开发服务>研发服务这就是沙箱环境的入口了,接下来就是需要设置一下参数了。3. 设置必要参数第一个需要设置的参数为RSA2(SHA25...
2021-03-14 12:31:39 4850 1
原创 xxl-job 不同版本的搭建
xxl-job简述XXL-JOB是一个轻量级的分布式任务调度平台,基于quartz实现,它修改了任务调度的模式,并且任务调度采用注册+RPC的方式实现。架构图xxl-job特性简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效调度中心HA(中心式):调度采用中心式设计,“调度中心”基于集群Quartz实现,支持集群部署,可保证调度中心HA(高可用)执行器HA(分布式):任务分布式
2021-03-14 12:20:44 2674 3
空空如也
硬件内存屏障和java内存屏障
2023-10-31
TA创建的收藏夹 TA关注的收藏夹
TA关注的人