10 fedorafrog

尚未进行身份认证

我要认证

暂无相关简介

等级
TA的排名 10w+

Java并发(八)CompletableFuture

1.前言上一篇文章全面分析了 Future,通过它我们可以获取线程的执行结果,它虽然解决了 Runnable 的 “三无” 短板,但是它自身还是有短板:不能手动完成计算假设你使用 Future 运行子线程调用远程 API 来获取某款产品的最新价格,服务器由于洪灾宕机了,此时如果你想手动结束计算,而是想返回上次缓存中的价格,这是 Future 做不到的调用 get() 方法会阻塞程序Future 不会通知你它的完成,它提供了一个get()方法,程序调用该方法会阻塞直到结果可用为止.

2020-07-31 17:19:21

Java并发(七)Future介绍

1. 前言创建线程有几种方式?这个问题的答案应该是可以脱口而出的吧 继承 Thread 类 实现 Runnable 接口 但这两种方式创建的线程是属于”三无产品“: 没有参数 没有返回值 没办法抛出异常 classMyThreadimplementsRunnable{@Overridepublicvoidrun(){log.info("mythread");}}Runnable 接口是 JDK1...

2020-07-31 16:10:40

强引用、弱引用、软引用和虚引用

前言Java执行GC判断对象是否存活有两种方式其中一种是引用计数。引用计数:Java堆中每一个对象都有一个引用计数属性,引用每新增1次计数加1,引用每释放1次计数减1。在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于(reachable)可达状态,程序才能使用它。从JDK 1.2版本开始,对象的引用被划分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。1. 强

2020-07-31 15:34:06

分库分表技术演进&最佳实践

移动互联网时代,海量的用户每天产生海量的数量,比如:用户表 订单表 交易流水表以支付宝用户为例,8亿;微信用户更是10亿。订单表更夸张,比如美团外卖,每天都是几千万的订单。淘宝的历史订单总量应该百亿,甚至千亿级别,这些海量数据远不是一张表能Hold住的。事实上MySQL单表可以存储10亿级数据,只是这时候性能比较差,业界公认MySQL单表容量在1KW以下是最佳状态,因为这时它的BTREE索引树高在3~5之间。既然一张表无法搞定,那么就想办法将数据放到多个地方,目前比较普遍的方案有3个:分区

2020-07-20 16:54:56

MySQL千万级大表优化

千万级大表如何优化,这是一个很有技术含量的问题,通常我们直觉思维都会 跳转到拆分或者数据分区。在此我想做一些补充和梳理,想和大家做一下这方面的经验总结和交流。以下是分析大纲内容。既然要吃透这个问题,我们势必要回到本源,我把这个问题分为三部分:“千万级”、“大表”、“优化”,也分别对应我们在图中的标识:“数据量”、“对象”、“目标”1. 数据量:千万级千万级只是一个感官数字,就是我们印象中的大数据量。这里我们需要把这个概念细化,因为随着业务和时间的变化,数据量也会有变化,我们应该是

2020-07-14 21:48:32

MySQL大数据量分页查询优化方法

1. limit分页的原理先来看一下分页的基本原理mysql explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20***************** 1. row **************id: 1select_type: SIMPLEtable: messagetype: indexpossible_keys: NULLkey: PRIMARYkey_len: 4ref: NULLrows: 1002

2020-07-14 10:10:02

Kafka详解(十一)Kafka日志读写实现

1.Kafka日志存储结构众所周知,Kafka的Topic可以有多个分区,分区其实就是最小的读取和存储结构,即Consumer看似订阅的是Topic,实则是从Topic下的某个分区获得消息,Producer也是发送消息也是如此。topic-partition关系上图是总体逻辑上的关系,映射到实际代码中在磁盘上的关系则是如下图所示:每个分区对应一个Log对象,在磁盘中就是一个子目录,子目录下面会有多组日志段即多Log Segment,每组日志段包含:消息日志文件(以log结尾)、位移索

2020-07-07 21:19:23

JVM的GC日志解析

前言刚开始接触JVM时,对待GC的日志,是保持"逃避"态度的,线上部署的程序没有达到期望的运行效率,或是预期目标时,往往会把问题的矛头指向内存上。是不是内存不够?GC日志怎么这么多?占用磁盘高达几个G?不想看到打印怎么多,甚至暴力的将程序日志屏蔽掉。我也曾经这样干过,写过的程序,同样导致过内存溢出,甚至是主机宕机。是的,java中的垃圾回收的确帮我们省了很多事,我们不像C/C++程序员一样,需要考虑分配(malloc)内存分配与(free)释放内存,但我相信每个java开发的

2020-07-03 11:02:10

MySQL的buffer pool缓冲池原理

应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库。操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问。MySQL作为一个存储系统,同样具有缓冲池(buffer pool)机制,以避免每次查询数据都进行磁盘IO。今天,和大家聊一聊InnoDB的缓冲池。InnoDB的缓冲池缓存什么?有什么用?缓存表数据与索引数据,把磁盘上的数据加载到缓冲池,避免每次访问都进行磁盘IO,起到加速访问的作用。速度快,那为

2020-06-29 11:21:14

Druid数据库连接池引起的FullGC问题排查、分析、解决

问题现象在某个工作日,突然收到线上的服务告警,有大量的请求延时产生,查看线上服务发现基本上都是获取数据库连接超时,而且影响时间只有3~4秒钟,服务又恢复了正常。隔了几分钟之后,又出现了大量的告警,还是影响3~4秒后又恢复正常。 由于我们是底层服务,被重多的上层服务所依赖,这么频繁的异常波动已经严重影响到了业务使用。开始排查问题排查过程DB的影响?当第一次告警产生时,第一反应是可能上层服务有大量的接口调用,并且涉及到一些复杂的SQL查询导致数据库连接数不够用,但是在分析了接口调用情况后发现异常

2020-06-29 10:55:41

Java线程池参数配置

在线程池的实际使用中,参数的配置总让人难以把握。在网上搜了一下,主要有以下的方案。跟大家分享。1. 基本概念1.1 ThreadPoolExecutor的重要参数corePoolSize:核心线程数核心线程会一直存活,及时没有任务需要执行 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理 设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭queueCapacity:任务队列容量(阻塞队列)当核心线程数达到最大时,

2020-05-13 16:40:38

JVM调优-命令篇

运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole、大名鼎鼎的VisualVM,IBM的Memory Analyzer等等,但是在生产环境出现问题的时候,一方面工具的使用会有所限制,另一方面喜欢装X的我们,总喜欢在出现问题的时候在终端输入一些命令来解决。所有的工具几乎都是依赖于jdk的接口和底层的这些命令,研究这些命...

2020-04-21 19:10:23

JVM调优-工具篇

16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化。工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题,长长可以到达事半功倍的效果来。jvm监控分析工具一般...

2020-04-21 18:59:08

玩转Java8Stream(一)

相信Java8的Stream 大家都已听说过了,但是可能大家不会用或者用的不熟,笔者将在《玩转Java8Stream》系列文章中带大家从零开始使用,循序渐进,带你走向Stream的巅峰。1. 操作符什么是操作符呢?操作符就是对数据进行的一种处理工作,一道加工程序;就好像工厂的工人对流水线上的产品进行一道加工程序一样。Stream的操作符大体上分为两种:中间操作符和终止操作符2....

2020-03-26 13:10:45

分布式事务,两阶段提交协议,三阶段提交协议

1.分布式中的CAP怎么理解1.1 CAPC(Consistency)一致性 每一次读取都会让你得到最新的写入结果A (Availability)可用性 每个节点(如果没有失败),总能执行查询(读取和写入)操作P (Partition Tolerance)分区容忍性 即使节点之间的连接关闭,其他两个属性也会得到保证CAP理论认为,任何联网的共享数据系统智能实现三...

2020-03-24 10:10:43

命令模式(Command模式)详解

在软件开发系统中,常常出现“方法的请求者”与“方法的实现者”之间存在紧密的耦合关系。这不利于软件功能的扩展与维护。例如,想对行为进行“撤销、重做、记录”等处理都很不方便,因此“如何将方法的请求者与方法的实现者解耦?”变得很重要,命令模式能很好地解决这个问题。在现实生活中,这样的例子也很多,例如,电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者),还有计算机键盘上的“功能键...

2020-03-18 09:46:39

策略模式(策略设计模式)详解

在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等。如果使用多重条件转移语句实...

2020-03-18 09:39:05

模板方法模式(模板方法设计模式)详解

在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它...

2020-03-18 09:32:44

门面模式(Facade模式)详解

在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了。软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外...

2020-03-18 09:24:36

组合模式(Composite模式)详解

在现实生活中,存在很多“部分-整体”的关系,例如,大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包、生活用品中的衣月艮与衣柜以及厨房中的锅碗瓢盆等。在软件开发中也是这样,例如,文件系统中的文件与文件夹、窗体程序中的简单控件与容器控件等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。1.组合模式的定义与特点组合(Composite)模式的定义:有时又叫作部分...

2020-03-16 14:57:34

查看更多

勋章 我的勋章
  • 阅读者勋章Lv1
    阅读者勋章Lv1
    授予在CSDN APP累计阅读博文达到3天的你,是你的坚持与努力,使你超越了昨天的自己。
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv4
    勤写标兵Lv4
    授予每个自然周发布9篇以上(包括9篇)原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。