- 博客(127)
- 资源 (7)
- 收藏
- 关注
原创 Java微基准性能测试:数字转字符串方式哪家强?JMH来帮忙
Java中数字转字符串方式哪家强?是它!Java中数字转字符串搞过吧?四种常用的转换方式,究竟用哪种最优呢,本次对Integer.toString(a)String.valueOf(a)a + “”“” + a四种数字转字符串的方式进行性能探究和分析,本文稍长,如有谬论和建议,欢迎指出。测试一波/** * CommonTest * * @author chenyaqiang * @date 2020/8/18 22:59 */public class CommonTest
2020-11-02 09:08:06
705
3
原创 一起来学高性能数据同步系统Canal
Canal简介canal [kə’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。基于日志增量订阅和消费的业务包括数据库镜像数据库实时备份索引构建和实时维护(拆分异构索引、倒排索引等)业务 cache 刷新
2020-07-30 11:40:02
907
1
原创 Guava Caches和Guava ListenableFuture学习
1.Guava是什么?Guava是Google的一组核心Java库,其中包括新的集合类型(例如多图和多集),不可变的集合,图形库以及用于并发,I / O,哈希,缓存,原语,字符串等的实用程序!它广泛用于Google的大多数Java项目中,也被许多其他公司广泛使用。它的github地址为: https://github.com/google/guava本次主要参照官方文档,对项目中用到的guava caches和guava listenableFuture进行了学习.2.Guava Caches2
2020-07-28 12:39:04
679
原创 关于[this is incompatible with sql_mode=only_full_group_by]的解决方案
先看报的SQL错误在经过一次MySQL数据库版本更换,项目的SQL出现了问题java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'XXX' which is not functionally de...
2019-12-25 11:16:01
482
原创 再谈Java多线程编程中的虚假唤醒
虚假唤醒和你写的程序逻辑无关!这是偏于底层的锅,是否看到有些博客写的虚假唤醒难以理解?各种逻辑看似合理,但却给出了虚假唤醒的错误解释?那么来看这篇文章吧,可以满足你的需求。首先,先看一波《Java并发编程的艺术》中关于等待/通知的经典范式的描述:等待方遵循如下原则:获取对象的锁。如果条件不满足,那么调用对象的wait()方法,被通知后仍要检查条件。条件满足则执行对应的逻辑。对应的...
2019-12-18 11:18:07
414
原创 1024打卡,大家节日快乐
加班太忙,1024打卡,从今天起把以前积累的问题慢慢变成博客产出啦!祝天下程序员们身体健康,代码无bug,每天开心的敲代码!希望在今后的日子里可以更快的成长,取得更大的进步,为更加优雅的代码努力!...
2019-10-24 23:27:08
309
原创 关于@Autowired注入空指针问题的解决(利用Bean的生命周期)
今天做项目的时候遇到一个问题,需要将线程池的参数抽取到yml文件里进行设置。这不是so easy吗?于是我就写出了下面这样的代码进行抽取import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;/** ...
2019-09-20 00:29:24
13493
转载 关于Java注解的那点事
最近复习spring的注解开发,本来想自己写一片关于java注解的文章加深记忆,结果发现一篇很优秀的文章 秒懂,Java 注解 (Annotation)你可以这样学仔细读了一下,这篇文章介绍的很不错,就转载来了这处图片引自老罗的博客。为了避免不必要的麻烦,首先声明我个人比较尊敬老罗的。至于为什么放这张图,自然是为本篇博文服务,接下来我自会说明。好了,可以开始今天的博文了。Annotatio...
2019-07-09 12:32:26
1036
原创 关于Git命令行的中文乱码问题和Git命令行中Java命令行的中文乱码问题解决
先看设置完成后的效果:话不多说,首先解决Git命令行的乱码问题:在git命令行上点击鼠标右键,点击 options… 进行设置,将 locale和 Character set调整到和下图中相同即可.调整完成这个,你会发现执行Java命令依然是乱码,接下来,打开系统的环境变量,添加变量名称为: JAVA_TOOL_OPTIONS,变量值为: -Dfile.encoding=UTF-...
2019-06-29 17:56:18
3243
转载 Jquery ajax, Axios, Fetch区别
本文转载自:https://segmentfault.com/a/1190000012836882#articleHeader0引言前端技术真是一个发展飞快的领域,我三年前入职的时候只有原生XHR和Jquery ajax,我们还曾被JQuery 1.9版本版本以下不支持大文件请求这个问题卡了半天(最后自己写了原生的XHR请求)。一晃眼,JQuery ajax早已不能专美于前,axios和fet...
2019-06-26 20:27:18
1952
原创 CORS跨域问题的实现
接3个月前写的一篇文章 为什么要禁止跨域的 Ajax 请求?为什么现在才接着写?很简单,回顾旧的知识的时候忽然发现跨域问题的实现有点忘记了,现在借此机会回忆一下。CORS的实现相对简单:浏览器端都有浏览器自动完成,我们无需操心服务端可以通过拦截器统一实现,不必每次都去进行跨域判定的编写。事实上,SpringMVC已经帮我们写好了CORS的跨域过滤器:CorsFilter ,内部已经...
2019-06-22 17:21:23
5958
原创 微服务架构中利用Nginx进行rewrite重写保护真实服务地址
为什么要用rewrite?对于微服务架构,暴露给外界的一般是Zuul网关,然后利用Zuul网关进行路由,有些服务不适于Zuul网关路由,比如文件上传,如果也经过Zuul网关的代理,文件就会经过多次网路传输,造成不必要的网络负担。在高并发时,可能导致网络阻塞,Zuul网关不可用。这样我们的整个系统就瘫痪了。所以,可以使用Nginx进行的rewrite进行重写地址进行跳转。有时, 我们后台的服务地址...
2019-06-22 16:42:43
7383
原创 关于对分布式文件系统FastDFS的原理和结合Spring Boot使用,最新版本tobato修正总结
关于FastDFS的搭建,这里不过多的介绍,网络上的文章也很多,或者直接用docker拉取一个FastDfS,满足测试开发也是没问题的。本文主要介绍FastDFS的原理,结合Spring Boot使用FastDFS。本文参考原理中部分参考 https://www.cnblogs.com/zhangs1986/p/8268927.html ,这篇文章非常全面的讲了FastDFS的配置,想了解搭建...
2019-06-22 16:08:47
7145
原创 对于Nginx,看这一篇基本可以了
我把找到的对Nginx总结相对较好的文章挑出来了,方便查询和学习。文章 一篇文章说透Nginx的rewrite模块文章 nginx的rewrite用法文章 Nginx配置文件(nginx.conf)配置详解答文章Nginx反向代理+Nginx性能优化配置详解文章nginx是以多进程的方式来工作的文章使用Nginx实现负载均衡...
2019-06-21 21:56:09
8006
转载 linux关于搜索的常用命令
linux的常用搜索命令,今天搜索的时候有点弄混了,所以找了一篇总结的文章,转自https://www.jianshu.com/p/95be6e4cff34, 并做了小的改动linux常用的搜索命令主要有locate,whereis,find,grep,type那么他们如何使用,有什么区别呢?下面就让我们一起来学习一下。1.locatelocate命令主要是在后台数据库中按文件名进行搜索,...
2019-06-21 17:34:37
6827
转载 Java之NIO和零拷贝(Zero Copy)
早就想写一篇关于NIO中的零拷贝的文章,今天逛博客看到一篇写的不错的文章,就转载过来了,相信对零拷贝不太了解的同学看到后会很有收获本文章转自: https://blog.csdn.net/cringkong/article/details/80274148一.Linux操作系统中的零拷贝1.1先从Linux的普通I/O过程说起1.2内存映射方式I/O1.3内核空间内部传输I/O1.4理...
2019-06-20 14:24:23
8530
原创 String str =“a“ + “b“ 与 String str = new String(“a“) + new String(“b“) 的区别(jdk1.8环境利用javap命令探究)
今天,又在思考一个常见的问题,那就是字符串创建对象系列。发现了一个很多人都模糊不清的问题,那就是String str =“a” + “b” 与 Strin str = new String(“c”) + new String(“d”) 把对象创建在了哪里?创建了几个字符串对象?话不多出,show my code:String str =“a” + “b”package com.bestqi...
2019-06-18 14:27:41
13992
6
原创 String中intern()方法
本文参考 https://blog.csdn.net/believesoul/article/details/79588305 ,我对这篇文章进行了一些小小的整理和修改。这篇文章很好的对intern()方法进行了阐述。最近在看字符串相关知识的时候,又看到了关于字符串创建方式和是否相等的相关问题,回忆起之前碰到的一个String中的intern()方法,它是一个本地方法(由Java语言外的语言编写...
2019-06-17 19:48:50
11316
原创 同步方法和静态同步方法使用的锁的类型
synchronized 修饰方法使用锁是当前this锁。synchronized 修饰静态方法使用锁是当前类的字节码文件。
2019-06-17 17:53:17
12489
原创 HashMap源码探究
HashMap实现了Map接口,即允许放入key为null的元素,也允许插入value为null的元素;除该类未实现同步外,其余跟Hashtable大致相同;跟TreeMap不同,该容器不保证元素顺序,根据需要该容器可能会对元素重新哈希,元素的顺序也会被重新打散,因此不同时间迭代同一个HashMap的顺序可能会不同。根据对冲突的处理方式不同,哈希表有两种实现方式,一种开放地址方式(Open ad...
2019-06-17 17:43:41
11235
原创 HeaFirst设计模式-单件模式[单例模式](Singleton Pattern)
单件模式本次主要介绍的内容有单件模式单线程下的单件模式实现多线程下的单件模式实现的三种方式单件模式:确保一个类只有一个实例,并提供一个全局访问点。...
2019-06-14 21:50:18
12780
原创 HeadFirst设计模式-工厂模式(基于汽车工厂和手机工厂)
工厂模式本次主要讲述三个内容:简单工厂模式工厂方法模式抽象工厂模式依赖倒置原则设计原则:要依赖抽象,不要依赖具体类。不能让高层组件依赖底层组件,而且,不管高层或底层组件,“两者”都应该依赖于抽象。这个原则告诉我们,应该重写代码以便于我们依赖抽象类,而不依赖具体类。指导方针:变量不可以持有具体类的引用。(如果使用new,就会持有具体类的引用。你可以改用工厂类避开这样的做法。...
2019-06-13 17:24:21
13154
原创 LinkedList源码探究
ArrayList源码探究本文全部以jdk1.8源码为根据,探究LinkedList的实现。转载请注明出处。LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack)。这样看来,LinkedList简直就是个全能冠军。当你需要使用栈或者队列时,可以考虑使用LinkedList,一方面是因为J...
2019-06-09 21:15:14
15084
原创 ArrayList源码探究
ArrayList源码探究本文全部以源码为根据,探究ArrayList的实现,原创blogs,转载请注明。构造方法ArrayList底层是一个长度可以动态增长的数组默认的构造方法是构建一个初始容量为10的空list用于默认大小的空实例的共享空数组实例。 我们将此与EMPTY_ELEMENTDATA区分开来,以便在添加第一个元素时知道要膨胀多少。上面不是说初始容量为10吗,奇怪了,为什...
2019-06-09 20:42:55
15038
原创 NIO源码分析之Selector
NIO源码分析之SelectorNIO的Selector源码第一句话就是 A multiplexor of {@link SelectableChannel} objects.即 SelectableChannel对象的多路复用器。这很清楚的说明了Selector的作用。这篇文章主要从以下几个点对Selector进行分析:选择器(Selector)可选择通道(SelectableCha...
2019-06-08 11:13:52
15496
原创 NIO源码分析之Buffer
NIO源码分析之BufferNIO博大精深,探寻NIO的源码后收获很多,在此进行记录。这次主要分析Buffer的源码,主要有以下几个内容。绝对方法和相对方法(position,limit,capacity属性的含义)Clearing,flipping,and rewinding 的作用线程不安全链式调用常用API源码分析绝对方法和相对方法相对方法: limit值与posit...
2019-06-07 18:15:46
15184
原创 (二)Netty基础操作案例
Netty网络聊天室:ChatClient 网络聊天室客户端package com.bestqiang.netty.chat;import io.netty.bootstrap.Bootstrap;import io.netty.channel.*;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channe...
2019-05-29 15:05:45
15968
1
原创 (一)Netty之整体设计与核心API
Netty是什么?Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序。Netty 是一个基于 NIO 的网络编程框架,使用 Netty 可以帮助你快速、简单的开发出一个网络应用,相当于简化和流程化了 NIO 的开发过程。作为当前最流行的 NIO 框架,Netty 在互联网领...
2019-05-29 14:50:31
15492
1
原创 (三)NIO之AIO,对比总结
AIO编程JDK 7 引入了 Asynchronous I/O,即 AIO。在进行 I/O 编程中,常用到两种模式:Reactor和 Proactor。Java 的 NIO 就是 Reactor,当有事件触发时,服务器端得到通知,进行相应的处理。AIO 即 NIO2.0,叫做异步不阻塞的 IO。AIO 引入异步通道的概念,采用了 Proactor 模式,简化了程序编写,一个有效的请求才启...
2019-05-28 22:04:12
16372
原创 (二)NIO之网络IO
概述和核心 API前面在进行文件 IO 时用到的 FileChannel 并不支持非阻塞操作,学习 NIO 主要就是进行网络 IO,Java NIO 中的网络通道是非阻塞 IO 的实现,基于事件驱动,非常适用于服务器需要维持大量连接,但是数据交换量不大的情况,例如一些即时通信的服务等等在 Java 中编写 Socket 服务器,通常有以下几种模式:一个客户端连接用一个线程,优点:程序编写简...
2019-05-28 21:45:13
16614
原创 (六)并发编程之Java中的锁
公平锁和非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁类似排队打饭 先来后到非公平锁是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情况下,有可能造成优先级反转或者饥饿现象两者的区别:公平锁/非公平锁并发包ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或者非公平锁 默认是非公平锁注:...
2019-05-27 21:50:28
17208
1
原创 (五)并发编程之容器类
java.util.ConcurrentModificationException标题的错误是由于多线程并发争抢修改导致的,在并发编程中使用线程不安全的容器导致的下面晒出导致错误的例子:package com.bestqiang.thread.Collections;import java.util.List;import java.util.UUID;import java.ut...
2019-05-27 21:18:22
17447
原创 (四)并发编程之CAS
CAS是什么?CAS ===》 compareAndSet 或者 compareAndSwap ,比较并交换,暂时这样理解,下面会对CAS做具体分析。public class CASDemo { public static void main(String[] args) { AtomicInteger atomicInteger = new AtomicInteger...
2019-05-27 20:26:05
17159
原创 (三)并发编程之线程池
为什么要使用线程池,优势是什么?线程池做的工作主要是控制运行的线程的数量,处理过程中将任务加入队列,然后在线程创建后启动这些任务,如果线程超过了最大数量,超出的数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行.他的主要特点为:线程复用控制最大并发数管理线程.第一:降低资源消耗.通过重复利用自己创建的线程降低线程创建和销毁造成的消耗.第二: 提高响应速度.当任务到达...
2019-05-27 16:31:14
17798
原创 (二)Java中的并发队列和阻塞队列
并发队列在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列非阻塞队列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue。阻塞队列与非阻塞队1.阻塞队列阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获...
2019-05-17 17:48:33
19094
1
原创 (一)并发包中的(计数器)CountDownLatch,(屏障)CyclicBarrier,(计数信号量)Semaphore
(计数器)CountDownLatchCountDownLatch 类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就...
2019-05-17 16:14:55
17394
原创 多线程之间按顺序调用,实现A->B->C三个线程启动(使用Lock锁)
题目:多线程之间按顺序调用,实现A->B->C三个线程启动,要求如下:AA打印5次,BB打印10次,CC打印15次…来十轮思路:使用Lock锁的多个Condition实现精准唤醒。package com.bestqiang.thread.Queue;/** * @author BestQiang */import java.util.concurrent.loc...
2019-05-17 15:43:34
19040
原创 关于多线程中的虚假唤醒的原因和解决,以及分别用Lock锁和阻塞队列实现消费者生产者案例
虚假唤醒: 有这么一种情况,在一个线程调用wait()进行等待时,被其他线程所唤醒,但是这时同时有另外的线程也被唤醒了,它抢先运行后,使得原来的唤醒条件又不满足了,这时就悲剧了,这个线程就称为被虚假唤醒了。 有人说,它所在的线程是加锁的,唤醒后不是依然不能运行吗,是的,但是它被唤醒了,等到获取锁后,依然会运行。解决: 所以为了避免这种情况,只好用while循环避免虚假唤醒。(因为if只判断一...
2019-05-17 15:21:40
18296
4
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人