- 博客(238)
- 资源 (1)
- 收藏
- 关注
原创 DoubleAdder源码解析
一、前言 DoubleAdder是JDK1.8中java.util.concurrent.atomic包中提供了一个新的原子类,和LongAdder差不多,理解了LongAdder也自然懂得了DoubleAdder。可以去看我的另外一篇博客《LonhAdder源码解析》。二、源码解析继承了哪些类 ...
2020-04-11 10:52:49 458
原创 LockSupport源码解析
一、前言 LockSupport 和 CAS 是Java并发包中很多并发工具控制机制的基础,它们底层其实都是依赖Unsafe实现。 LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport 提供park()和unpark()方法实现阻塞 线程和解除线程阻塞,LockSup...
2020-04-11 09:57:16 450
原创 Lock接口注释翻译
一、前言 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。在lock接口出现之前程序是靠synchronized关键字实现锁功能,lock接口提供了与synchronized关键字类似的同步功能,只是在使用的过程中需要显示的获取和释放锁。缺点:缺少隐士获取释放锁的便捷性。优点:拥有锁获取与释放的可操作性...
2020-04-10 16:38:09 273
原创 LongAdder源码解析
一、前言 JDK1.8时,java.util.concurrent.atomic包中提供了一个新的原子类:LongAdder。LongAdder在高并发的场景下会比AtomicLong 具有更好的性能,代价是消耗更多的内存空间。二、提出问题1. 为什么要引入LongAdder? 2. LongAdder快在哪里? 3. 如果低并发环境下,Lo...
2020-04-10 10:04:32 283
原创 AtomicStampedReference源码解析
一、前言 AtomicInteger、AtomicLong等这类Atomic类都不能避免ABA问题,但项目中经常需要避免这类问题,此时可采用AtomicStampedReference进行辅助开发。AtomicStampedReference内部本身不能避免ABA,但它通过设置版本号,每次设置完成后对版本号进行比对,以此验证更新是否正确,不正确则重试...
2020-04-09 10:42:25 270
原创 AtomicReferenceArray源码解析
一、前言 AtomicReferenceArray类是java.util.concurrent.atomic包下的提供了可以原子读取和写入的底层引用数组的操作,并且还包含高级原子操作。 AtomicReferenceArray支持对底层引用数组变量的原子操作。 利用泛型机制可以对多种数据类型进行操作,如Integer等。二、源码解析继承了哪些类...
2020-04-09 09:10:13 641
原创 AtomicLongArray源码解析
一、前言 AtomicLongArray和AtomicIntegerArray源码都是差不多的,区别就是数据类型不一样而已,一个是long类型一个是int类型,都是支持对底层数组变量的原子操作。二、源码解析继承了哪些类 由上图可知AtomicLongArray只继承了一个Serializable接...
2020-04-08 17:18:43 193
原创 AtomicIntegerArray源码解析
一、前言 AtomicIntegerArray类是java.util.concurrent.atomic包下的提供了可以以原子方式读取和写入的底层int数组的操作,还包含高级原子操作的并发数组类。 AtomicIntegerArray支持对底层int数组变量的原子操作。 它具有获取和设置方法,如在变量上的读取和写入。 也就是说,一个集合与同一变量上的...
2020-04-08 16:11:08 666
原创 AtomicReference源码解析
一、前言 AtomicReference和AtomicInteger非常类似,不同之处就在于AtomicInteger是对整数的封装,而AtomicReference则对应普通的对象引用。也就是它可以保证你在修改对象引用时的线程安全性。AtomicReference是作用是对”对象”进行原子操作。 提供了一种读和写都是原子性的对象引用变量...
2020-04-08 09:47:32 352
原创 AtomicLong源码解析
一、前言 AtomicLong是作用是对长整形进行原子操作,是java.util.concurrent.atomic包下的一个提供原子操作的Long类型数据的类。在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性。而使用AtomicLong能让long的操作保持原子型。二、源码...
2020-04-08 09:09:36 1124
原创 AtomicInteger源码解析
一、前言 AtomicBoolean是java.util.concurrent.atomic包下的一个提供原子操作的Integer的类。在Java语言中,++i和i++、–i和i–操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字,而AtomicInteger则通过一种线程安全的加减操作接口。二、源码解析继承了哪些...
2020-04-07 15:32:44 218
原创 AtomicBoolean源码解析
一、前言 AtomicBoolean是java.util.concurrent.atomic包下的一个原子并发类,作用是用原子方式更新的 boolean 值。换一句话说,Atomic就是原子性的意思,即能够保证在高并发的情况下只有一个线程能够访问这个属性值(类似我们之前所说的volatile)。二、源码解析继承了哪些类 ...
2020-04-07 15:03:30 223
原创 利用Memory Analyzer来对OOM进行分析
一、什么是OOM? OOM就是outOfMemory,内存溢出!可能是每一个java人员都能遇到的问题!原因是堆中有太多的存活对象(GC-ROOT可达),占满了堆空间。二、怎么解决?利用MemoryAnalyzer进行Heap分析:去eclipse官网上去下载MemoryAnalyzer,可以下载非插件版的,这样MemoryAnalyzer运行...
2020-04-07 10:16:17 919
原创 如何利用 Jconsole 检测出死锁
一、前言 Java中当我们的开发涉及到多线程的时候,这个时候就很容易遇到死锁问题,刚开始遇到死锁问题的时候,我们很容易觉得莫名其妙,而且定位问题也很困难。 因为涉及到java多线程的时候,有的问题会特别复杂,而且就算我们知道问题出现是因为死锁了,我们也很难弄清楚为什么发生死锁,那么当我们遇到了死锁问题,...
2020-04-07 09:08:33 953
原创 JVM中7种垃圾收集器分析和理解
一、前言 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商、版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器。接下来讨论的收集器基于JDK1.7 Update 14 之后的H...
2020-04-06 10:55:09 150
原创 行锁功过:怎么减少行锁对性能的影响?
一、前言 在上一篇文章中,我跟你介绍了 MySQL 的全局锁和表级锁,今天我们就来讲讲 MySQL 的行锁。 MySQL 的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如 MyISAM 引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只...
2020-03-29 09:58:36 71
原创 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
一、前言 今天我要跟你聊聊 MySQL 的锁。数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。 根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。今天这篇文章,我会和你分...
2020-03-29 08:37:36 55
原创 事务隔离:为什么你改了我还看不见?
一、前言 提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱。 转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的,不然等程序查完之后,还没做减法之前,...
2020-03-28 12:09:32 62
原创 Java中常见OOM的场景及解决方法
一、OOM for Heap (java.lang.OutOfMemoryError: Java heap space) 分析 此OOM是由于JVM中heap的最大值大于程序运行期间最大可用内存大小,如果程序运行需要占用更多的内存,超出了这个设置值,就会抛出OutOfMemory异常。解决思路将设置heap的最大值调高即可,即-Xmx的值调大。...
2020-03-26 20:05:48 2316
原创 String源码解析
一、前言 众所周知字符串String是不可变的,当你改变其字符串内容的时候,他的底层是重新创建一个新的字符串,并且让栈中的对象引用指向新的字符串的地址的,那到底这是怎么实现的呢?接下来我们一起去看看String字符串的底层源码是如何实现的。二、String内部的变量有哪些? 在看String内部变量之...
2020-03-22 16:34:26 246
原创 为什么B+树适合作为索引的结构
一、前言 本文是在讲述什么样的数据结构适合作为索引,以及其适合作为索引的原因。而阅读本文需要对B树和B+树结构有稍微的理解。以及需要对磁盘操作知识有稍微的了解。 在MySQL中,主要有四种类型的索引,分别为:B-Tree索引,Hash索引,Fulltext索引和R-Tree索引,本文讲的是B-Tree索...
2020-02-29 10:52:27 309
原创 分库与分表带来的分布式困境与应对之策
一、前言 随着用户数的不断增加,以及数据量的不断增加,通过分库与分表的方式提高查询性能的同时,带来了一系列分布式困境。二、数据迁移与扩容问题 水平分表策略归纳总结为随机分表和连续分表两种情况。连续分表有可能存在数据热点的问题,有些表可能会被频繁地查询从而造成较大压力,热数据的表就成为了整个库的瓶颈,而...
2020-02-29 10:09:43 265
原创 linux系统下查看CPU的各个情况
一、查看统计信息① 命令如下:vmstat #命令报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。② 如下截图所示:二、各个模块的作用① procsr #列表示运行和等待cpu时间片的进程数,如果长期大于1,说明cpu不足,需要增加cpu。b #列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。② memoryswpd #切换到内存交换区的内存...
2020-02-28 19:53:25 194
原创 怎样设置虚拟机virtualbox 网关和Linux IP?
一、只有一种情况可以自动获取IP地址,那就是您的Linux所在的网络环境中有DHCP服务。二、只要您的真机可以自动获取IP,那么安装在虚拟机的Linux同样也可以自动获取IP. 方法很简单,只需要运行一个命令:dhclient三、如果您的虚拟机不能自动获取IP,那么只能手动配置,配置方法为:vi /etc/sysconfig/network-scripts/ifcfg-eth0进入编...
2020-01-31 14:45:04 1630
原创 filebeat部署与运用
一、前言 Filebeat是本地文件的日志数据采集器,可监控日志目录或特定日志文件(tail file),并将它们转发给Elasticsearch或Logstatsh进行索引、kafka等。带有内部模块(auditd,Apache,Nginx,System和MySQL),可通过一个指定命令来简化通用日志格式的收集,解析和可视化。二、部署与运行①....
2020-01-20 23:28:29 1185
原创 一条SQL语句执行得很慢的原因有哪些?
一、前言 说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考你计算机网络的知识时,问你“输入URL回车之后,究竟发生了什么”一样,看看你能说出多少了?二、分类讨论大多数情况是正常的,只是偶尔会出现很慢的情况。在数据量不变的情况下,这条SQL语句一直以来都执行的很慢。三、针对偶尔很慢的情况 &nbs...
2020-01-19 10:11:36 299
原创 MySQL性能优化规范建议
一、数据库命令规范所有数据库对象名称必须使用小写字母并用下划线分割。所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)。数据库对象的命名要能做到见名识意,并且最后不要超过 32 个字符。临时库表必须以 tmp_为前缀并以日期为后缀,备份表必须以 bak_为前缀并以日期 (时间戳) 为后缀。所有存储相同数据的列名和列类型必须一致(一般...
2020-01-19 09:58:03 216
原创 什么是外观模式?
一、定义 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。二、角色外观(Facade)角色 : 客户端可以调用这个角色的方法。此角色知晓相关子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。子系统...
2020-01-15 00:24:34 800
原创 什么是原型模式?
一、定义 通过复制现有的对象实例来创建新的对象实例。二、实现实现Cloneable接口: Cloneable接口的作用是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedEx...
2020-01-14 10:51:21 410
原创 什么是代理模式?
一、定义 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。二、角色抽象角色:声明真实对象和代理对象的共同接口。代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替...
2020-01-12 23:36:36 531 1
原创 什么是装饰者模式?
一、定义 在不必改变原类文件和原类使用的继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是用装饰来包裹真实的对象来实现。二、角色抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象。具体构件角色(Employe):定义一个将要接收附加责任的类。装饰角色(Manager):持有一个构件对象的实例,并...
2020-01-10 09:03:57 182
原创 什么是适配器模式?
一、定义 将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。二、角色目标(Target)角色:这就是所期待得到的接口,也就是这类的接口是符合我们要求的。源(Adapee)角色:我们要使用的接口,但是这个接口不符合我们的要求,也就是现在需要适配的接口。适配器(Adaper)角色:适...
2020-01-07 16:45:52 896
原创 基于Docker安装RabbitMQ,一次性安装成功
一、简介 RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库 注意:若没有安装Docker的话,可以看我的另外一篇博...
2020-01-06 22:47:11 217
原创 Nginx的配置文件各个模块介绍
一、前言 学习Nginx首先需要对它的核心配置文件nginx.conf有一定的认识,Nginx的核心配置文件主要由三个部分构成:基本配置events配置http配置二、各个模块的作用#==============基本配置===================#user nobody; #配置worker进程运行用户worker_...
2020-01-04 15:22:04 952
原创 Linux环境下安装Nginx详细步骤,一次安装成功
一、Nginx简介Nginx (engine x) 是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器;Nginx 是由俄罗斯人 Igor Sysoev 采用C语言开发编写的,第一个公开版本0.1.0发布于2004年10月4日;Nginx 特点是占有内存少,并发处理能力强,以高性能、低系统资源消耗而闻名,Nginx官方测试为5万并发请求;与Nginx同类型的Web服务器...
2020-01-04 15:14:27 415
原创 关于二叉树的几道基础编程题
一、树的节点public class ThreeNode { public Object data; public ThreeNode leftChild; public ThreeNode rightChild; public ThreeNode(){ this(null); } public ThreeNode(Objec...
2019-11-11 20:54:29 413
原创 面向对象和面向过程的区别
什么是面向对象? 面向对象就是在一个事务(问题)中,将一个事务(问题)的某些共同特性封装在一个对象中,创建对象不是为了完成某个步骤,而是完成整个事务中某种行为。什么是面向过程? 面向过程就是在一个事务(问题)中,将事务划分为一个个步骤,通过函数实现这些步骤,然后依次调用执行即可。举个简单点的例子来区...
2019-10-24 09:33:01 3011 1
原创 Spring Boot中获取通过@Bean注入Spring容器的对象实体
一、前言 最近在项目中想获取Spring容器中的注册好的Bean对象,但是因为项目是使用Spring Boot中的,不能用ClassPathXmlApplicationContext来获取指定Bean,然后去学习别人的方法,并且成功测试过确实可行,就想总结一下这个Bean获取的方法的实现。二、实现步骤1、设置BeanConfig类,添加指定Bea...
2019-10-18 22:41:43 1137 1
原创 nexus中央仓库索引离线索引库
一、前言 Nexus可以在线更新中央仓库索引,但是更新速度慢,而且很有可能下载的索引不全,但是离线更新中央仓库索引的方式的速度就很快并且可靠,接下来介绍如和搭建一个离线的索引库。二、安装步骤1、访问http://repo.maven.apache.org/maven2/.index/下载中心仓库最新版本的索引文件。【1】需要下载如下两个文件ne...
2019-10-04 16:37:25 1676 1
原创 IDEA下运行Web项目 页面出现中文乱码
一、前言 在web项目中,主要编码格式改变的地方有:虚拟机加载文件编码IDE的保存文件编码html文件,xml文件等外部保存的编码web服务器入tomcat的编码二、修改编辑器的编码#编辑器的乱码,这个很好解决,将其全部变成UTF-8file->settings->editor->file Encodings如下图所示:三、控制台...
2019-09-03 22:55:12 12052 6
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人