5 SunAlwaysOnline

尚未进行身份认证

我要认证

开始工作的第一年!

等级
TA的排名 2k+

Java8之Optional扫盲

在java8中,引入Optional类,来缓解对每次都需要变量判空的尴尬。Optional在一定程度上,能够减少判空产生的级联深度,运用lambda表达式,也能够在一定程度上简化代码。创建一个Optional1、创建一个可以包含null的Optional Optional<String> optional = Optional.ofNullable(null);2、创建一个包含null的Optional Optional<Object> empt

2020-08-12 23:04:20

线上遇到的慢查询的案例,MySQL慢查询到底该如何“优化”?

一.复杂的深分页问题优化背景有一个article表,用于存储文章的基本信息的,有文章id,作者id等一些属性,有一个content表,主要用于存储文章的内容,主键是article_id,需求需要将一些满足条件的作者发布的文章导入到另外一个库,所以我同事就在项目中先查询出了符合条件的作者id,然后开启了多个线程,每个线程每次取一个作者id,执行查询和导入工作。查询出作者id是1111,名下的所有文章信息,文章内容相关的信息的SQL如下:SELECT a.*, c.*FROM .

2020-08-07 09:16:46

SpringBoot集成RabbitMQ

容器化运行RabbitMQ,可以参考我之前的一篇文章容器化运行RabbitMQ本篇不讲解RabbitMQ的理论知识,均采用最简配置那么消息队列,需要一个消息的生产者与消费者创建一个生产者:引入相关的依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-a

2020-08-06 17:02:35

容器化运行RabbitMQ

拉取最新版本的RabbitMQ镜像docker pull rabbitmq运行容器docker run -d --name rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq指定了管理界面默认的用户名与密码,并且需要开放5672与15672端口这个时候需要进入容器,开启管理功能,其中977cfb682dd3为容

2020-08-06 15:38:55

如何排查java应用的死锁

首先,我们构造一个死锁场景。如何构造一个死锁呢?

2020-08-04 22:13:12

浅谈JVM调优中的两个小知识点

对JVM的调优,需要大量的场景以及经验,本篇主要是从一个理论的角度,粗浅地对堆这边不太熟悉的同学,可以先参考我的这一篇文章说说java中的堆区我把堆区的主要结构以及参数放在下面,这样可以参照着图来看:一、如何设置最大年龄每发生一次Young GC,就会将Eden区和当前的Survivor区的存活对象一次性地转入到另外一个Survivor区中,并将之前的Eden区以及Survivor区清空。所以年轻代的存活对象,基本上就是在两块Survivor区中换来换去,每换一次,年龄增加1岁。当到达最

2020-08-03 22:44:10

记录第一次出差的经历

前奏篇2020年6月19日的下午,是一个周五。在这个悠闲的时光里,我翘着二郎腿,写着再普通不过的curd。突然,主管仿佛捕捉到了我迷离的眼神,慢慢地走到我的旁边,拉着我的衣角。我想:该不会我摸鱼被发现了吧,主管想炸了我的鱼塘?主管:成都某行那边有个项目,需要暂时找个人过去支撑一下。你看我们这边有家室的有家室,有女朋友的有女朋友,你啥也没有,无依无靠,领导打算派你过去支撑一个月到一个半月。我:.......(没有女朋友也不要说出来啊)好的,多谢领导赏识,这次任务我势在必得。.

2020-07-23 15:30:12

CI 与 CD 有什么区别

CI, CD AND CDCI很容易理解,就是持续集成。但是CD既可以指代码持续交付,也可理解为代码持续部署。CI和CD之间有很多相似的部分,但是也有很大的区别。持续集成(CONTINUOUS INTEGRATION)在持续集成环境中,开发人员将会频繁的提交代码到主干。这些新提交在最终合并到主线之前,都需要通过编译和自动化测试流进行验证。这样做是基于之前持续集成过程中很重视自动化测试验证结果,以保障所有的提交在合并主线之后的质量问题,对可能出现的一些问题进行预警。持续交付(CONTINUOU

2020-06-21 21:11:53

SQL中有关DQL、DML、DDL、DCL的概念与区别

SQL(Structure Query Language)结构化查询语言是数据库的核心语言,是高级的非过程化编程语言。它功能强大,效率高,简单易学易维护。SQL语言基本上独立于数据库本身、使用的机器、网络、操作系统,基于SQL的DBMS产品可以运行在从个人机、工作站到基于局域网、小型机和大型机的各种计算机系统上,具有良好的可移植性。SQL结构化查询语言包含6个部分1.数据查询语言(DQL: Data Query Language)数据检索语句,用于从表中获取数据。通常最常用的为保留字SELECT

2020-06-21 20:55:47

什么是 开发环境、测试环境、生产环境、UAT环境、仿真环境

开发环境:开发环境是程序猿们专门用于开发的服务器,配置可以比较随意, 为了开发调试方便,一般打开全部错误报告。测试环境:一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常,那么肯定不能把它发布到生产机上。生产环境:是指正式提供对外服务的,一般会关掉错误报告,打开错误日志。可以理解为包含所有的功能的环境,任何项目所使用的环境都以这个为基础,然后根据客户的个性化需求来做调整或者修改。三个环境也可以说是系统开发的三个阶段:开发->测试->上线,其中生产环境也就是通常说的真实环境。

2020-06-19 10:48:37

【MySQL】谈谈锁的类型

MySQL中的锁分为表锁以及行锁,从字面意思就可以得知,表锁是对一整张表进行加锁,而行锁是针对于特定的行。在Server层面,提供了表锁的实现,而行锁则由存储引擎实现。Innodb引擎支持行锁,Myisam则不支持行锁。

2020-06-16 23:14:25

ThreadLocal使用不好,小心造成内存泄露!

一、前言对ThreadLocal不熟悉的同学,可以先参考我的另外一篇文章浅谈ThreadLocal在讨论内存泄漏之前,需要明白java中的四种引用,同样可以移步到java中的四种引用

2020-06-14 00:24:23

Java8中Stream的常用方法

一、前言这篇文章简单总结一下Lambda中的常用方法对Lambda不熟悉的同学,可以参考这篇进行入门对Lambda的理解,Lambda真是越用越爽如果刚刚入门Lambda,但对Consumer、Supplier、Predicate与Function不怎么熟悉的同学,可以参考这篇文章快速理解Consumer、Supplier、Predicate与Function如果已经对Lambda很熟悉的同学,但对其执行原理不太懂的同学,可以参考我的这篇文章Lambda执行原理二、排序需求,按照学生

2020-06-10 10:16:41

【数据库】binlog、redo log、undo log扫盲

一、什么是binlogbinlog其实在日常的开发中是听得很多的,因为很多时候数据的更新就依赖着binlog。举个很简单的例子:我们的数据是保存在数据库里边的嘛,现在我们对某个商品的某个字段的内容改了(数据库变更),而用户检索的出来数据是走搜索引擎的。为了让用户能搜到最新的数据,我们需要把引擎的数据也改掉。一句话:数据库的变更,搜索引擎的数据也需要变更。于是,我们就会监听binlog的变更,如果binlog有变更了,那我们就需要将变更写到对应的数据源。什么是binlog?binl

2020-06-09 11:02:29

ConcurrentHashMap 底层原理

这篇文章,我打算从以下几个方面来讲。1)多线程下的 HashMap 有什么问题?2)怎样保证线程安全,为什么选用 ConcurrentHashMap?3)ConcurrentHashMap 1.7 源码解析 底层存储结构 常用变量 构造函数 put() 方法 ensureSegment() 方法 scanAndLockForPut() 方法 rehash() 扩容机制 get() 获取元素方法 remove()

2020-06-09 09:32:40

【设计模式】代理模式

一、前言Spring中的AOP思想就是对代理模式的经典运用,下面先讲讲代理模式的核心思想,以静态代理为例。二、示例下面有这样一个例子,委托人在遭遇利益受损的时候,可以委托律师帮忙打官司。先定义一个描述行为的接口:package com.design.proxy.statics;public interface Action { void handle();}委托人,实现这个接口,主要的行为是寻找律师。package com.design.proxy.stati

2020-06-01 20:27:36

【HashMap】为什么长度总是2的整数次方

前言开门见山,HashMap这样做有两点原因提升计算效率,更快算出元素的位置 减少哈希碰撞,使得元素分布均匀提升计算效率我们先看put方法的细节: public V put(K key, V value) { return putVal(hash(key), key, value, false, true); }其中hash(key)如下: static final int hash(Object key) { int h;

2020-05-25 18:00:40

【多线程】LongAdder实现原理

前言AtomicInteger、AtomicLong使用非阻塞的CAS算法原子性地更新某一个变量,比synchronized这些阻塞算法拥有更好的性能,但是在高并发情况下,大量线程同时去更新一个变量,由于同一时间只有一个线程能够成功,绝大部分的线程在尝试更新失败后,会通过自旋的方式再次进行尝试,严重占用了CPU的时间片。AtomicLong的实现原理图:LongAdder是JDK8新增的原子操作类,它提供了一种新的思路,既然AtomicLong的性能瓶颈是由于大量线程同时更新一个变量造成的,

2020-05-24 00:42:17

【多线程】说说线程池

前言线程池内部是多个线程的集合,在创建初期,线程池会创建出多个空闲的线程,当有一个任务需要执行时,线程池会选择出一个线程去执行它,执行结束后,该线程不会被销毁,而是可以继续复用。使用线程池可以大大减少线程频繁创建与销毁的开销,降低了系统资源的消耗。当任务来临时,直接复用之前的线程,而不是先创建,提高了系统的响应速度。此外,线程池可以控制最大的并发数,避免资源的过度消耗。简单实例先给出一个线程池的简单例子:package com.xue.testThreadPool;import j

2020-05-21 11:03:06

【多线程】Semaphore实现原理

前言Semaphore,信号量,一般用于控制同时访问资源的线程数量。可以认为Synchronized代表的是一把锁,那么Semaphore就是多把锁。常用方法public class Semaphore implements java.io.Serializable { //构造方法,传入令牌数,默认实例化一个非公平锁 public Semaphore(int permits); //获取一个令牌,在获取成功之前,以及被其他线程中断之前,当前线程会被阻塞 pub

2020-05-20 13:51:53

查看更多

勋章 我的勋章
  • 领英
    领英
    绑定领英第三方账户获取
  • GitHub
    GitHub
    绑定GitHub第三方账户获取
  • 脉脉勋章
    脉脉勋章
    绑定脉脉第三方账户获得
  • 签到王者
    签到王者
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 技术圈认证
    技术圈认证
    用户完成年度认证,即可获得
  • 新人勋章
    新人勋章
    用户发布第一条blink获赞超过3个即可获得
  • 阅读者勋章Lv1
    阅读者勋章Lv1
    授予在CSDN APP累计阅读博文达到3天的你,是你的坚持与努力,使你超越了昨天的自己。
  • 专栏达人
    专栏达人
    授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 1024勋章
    1024勋章
    #1024程序员节#活动勋章,当日发布原创博客即可获得
  • 勤写标兵Lv2
    勤写标兵Lv2
    授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
  • 学习力
    学习力
    《原力计划【第二季】》第一期主题勋章 ,第一期活动已经结束啦,小伙伴们可以去参加第二期打卡挑战活动获取更多勋章哦。
  • 原力新人
    原力新人
    在《原力计划【第二季】》打卡挑战活动中,成功参与本活动并发布一篇原创文章的博主,即可获得此勋章。
  • 分享精英
    分享精英
    成功上传11个资源即可获取