- 博客(417)
- 资源 (53)
- 收藏
- 关注
原创 JAVA并发容器-ConcurrentHashMap 1.7和1.8 源码解析
HashMap是一个线程不安全的类,在并发情况下会产生很多问题,详情可以参考HashMap 源码解析;HashTable是线程安全的类,但是它使用的是synchronized来保证线程安全,线程竞争激烈的情况下效率非常低下。在jdk1.5的时候引入了ConcurrentHashMap,这也是一个线程安全的类,它使用了分段锁的技术来提升并发访问效率。HashTable容器在竞争激烈的并发环境下表现...
2019-11-28 09:55:59 378 2
原创 二叉树遍历算法
二叉树遍历算法有4种,先序、中序、后序和层序遍历先序遍历:先根、后左、再右中序遍历:先左、后根、再右后序遍历:先左、后右、再根层序遍历:从上往下,从左往右先序遍历:A → B → D → C中序遍历:B → D → A → C后续遍历:D → B → C → A层序遍历:A → B → C → D先序遍历:A → B → D → C /** * 先序遍历递...
2019-11-28 09:53:51 411
原创 红黑树原理
红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。性质节点是红色或黑色。根节点是黑色。每个叶子节点(NIL)是黑色。 (注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!)每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)从任一节点到其每个叶子的所有路径都包含相...
2019-11-28 09:52:53 436
原创 HashMap 源码解析
源码学习,边看源码边加注释,边debug,边理解。基本属性常量DEFAULT_INITIAL_CAPACITY:默认数组的初始容量 - 必须是2的幂。MAXIMUM_CAPACITY:数组的最大容量DEFAULT_LOAD_FACTOR:哈希表的负载因子0.75TREEIFY_THRESHOLD:在一个桶内由树转换成链表的阈值UNTREEIFY_THRESHOLD:又树转换成链...
2019-11-28 09:32:30 174
原创 AQS AbstractQueuedSynchronizer 同步框架
队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架。它主要的设计思想是使用一个名为state的int类型成员变量来表示同步状态,AQS里面大部分方法都是再对这个边进行操作;再内置一个FIFO队列来完成资源获取线程的排队工作。AQS的使用方式主要使用继承方式,并且推荐使用静态内部类,这样做的好处是隔离了使用者和实现者所关注的领...
2019-11-27 14:43:51 179
原创 Java中的锁
锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时 访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁)。Lock和synchronized的主要区别:synchronized它是隐式的获取和释放锁,使用起来更方便,但是不灵活。Lock接口获取和释放锁是由我们自己控制,更加灵活Lock接口支持超时获取锁和可中断获取锁Lock的使用的方式...
2019-11-27 14:42:45 143
原创 CyclicBarrier和CountDownLatch的区别
CountDownLatch是两组线程,第一组负责计数器减一,第二组是阻塞线程,当第一组线程将计数器减到0时,第二组线程才开始执行,放行是由第三方控制;CyclicBarrier是只有一组线程,只有当所有线程到达拦截点的时候,才会继续往下执行,放行是由一组线程本身控制。CountDownLatch放行条件是大于或等于线程数;CyclicBarrier放行条件是等于线程数CountDownLa...
2019-11-27 14:41:10 813
原创 CyclicBarrier并发工具类
作用让一 组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开放,所有被屏障拦截的线程才会继续运行。核心方法CyclicBarrier(int parties):默认构造方法,parties参数表示屏障拦截的线程数量CyclicBarrier(int parties, Runnable barrierAction):barrierAction表示屏障开放的...
2019-11-27 14:39:41 150
原创 CountDownLatch并发工具类
作用CountDownLatch允许一个或多个线程等待其他线程完成操作,相当于一个加强版的join方法。核心方法CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完 成,这里就传入N。countDown:负责计数器的减一await:阻塞当前线程,直到CountDownLatch计数器变成零由于countDown方法可以用在任何地方,所以这里...
2019-11-27 14:38:47 192
原创 Fork/Join框架运行原理
Fork/Join框架的入门可以参考Fork/Join框架。Fork/Join框架的核心类有两个一个是ForkJoinPool,它主要负责执行任务;一个是ForkJoinTask,主要负责任务的拆分和结果的合并;ForkJoinPool它和ThreadPoolExecutor一样也是一个线程池的实现,并且同样实现了Executor和ExecutorServiceie接口,类图如下:核心内部...
2019-11-27 14:37:58 374
原创 Fork/Join框架
Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干 个小任务(Fork),最终汇总每个小任务结果后得到大任务结果(Join)的框架。分而治之一个规模为N的问题,当N小于阀值时直接执行,当N大于阀值时将N分解成K个小规模子问题,子问题之间相互独立,并与原问题形式相同,最后将所有子问题的解合并得到原问题的解,叫做分而治之。工作窃取算法工作窃取(wo...
2019-11-27 14:36:51 1040
原创 java如何实现原子操作CAS
在Java中可以通过锁和循环CAS的方式来实现原子操作。使用循环CAS实现原子操作JVM中的CAS操作正是利用了处理器提供的CMPXCHG指令实现的。自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止。CAS实现原子操作的三大问题ABA问题,循环时间长开销大,以及只能保证一个共享变量的原子操作。ABA问题因为CAS需要在操作值的时候,检查值有没有发生变化,如果没有发生变化 则更...
2019-11-27 14:35:53 426
原创 synchronized关键字
Java中的每一个对象都可以作为锁。具体表现为以下3种形式。对于普通同步方法,锁是当前实例对象。对于静态同步方法,锁是当前类的Class对象。对于同步方法块,锁是Synchonized括号里配置的对象。原理JVM基于进入和退出Monitor(监视器)对象来实现方法同步和代码块同步,两者的实现细节不一样。但是都可以使用monitorenter和monitorexit指令来实现。mon...
2019-11-27 14:35:14 230
原创 volatile关键字
volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是一个线程修改一个共享变量时,另一个线程能读到这个修改后的值。volatile的使用成本比synchronized的低,因为它不会引起上下文的切换和调度。定义为了保证共享变量被准确个一致的更新,线程因该确保通过排它锁单独获得这个变量。如果一个字段被声明成volatile,java线程内...
2019-11-27 14:34:23 158
原创 并发编程基础
CPU时间片轮转机制CPU时间片轮转机制也称时间片轮转法(Round-Robin,RR)主要用于分时系统中的进程调度。时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一时间段,称作它的时间片,即该进程允许运行的时间。进程之间的切换会产生上下文切花,每次切换需要耗费5000到2W个时钟周期。所有我们在进行并发编程的过程中因该尽量减少上下文的切换。怎样减少上下文的切换...
2019-11-27 14:33:22 112
原创 java多线程基础
java是一个天生就支持多线程的语言。查看JVM内的线程public static void main(String[] args) { //虚拟机线程管理的接口 ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); ThreadInfo[] threadInfos =...
2019-11-27 14:31:54 268
原创 idea 解决jira包冲突
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <version>1.4.1</version> <executions> <exe...
2019-08-19 20:56:10 521
原创 Spring Boot对内嵌数据库的支持
开发应用时使用内存数据库是很实用的。很方便的一点是,内存数据库不需要提供持久化存储。 你不需要在应用启动时做初始化数据库动作, 也不需要在应用结束时去删除数据。Spring Boot可以自动配置的内嵌数据库包括H2,HSQL和Derby。你不需要提供任何连接URLs, 只需要简单的添加你想使用的内嵌数据库依赖。示例:典型的POM依赖如下:<dependency> ...
2019-07-15 09:28:16 5332
原创 缓存设计要点-缓存穿透、缓存击穿和缓存雪崩实践
我们使用缓存的主要目是提升查询速度和保护数据库等稀缺资源不被占满。而缓存最常见的问题是缓存穿透、击穿和雪崩,在高并发下这三种情况都会有大量请求落到数据库,导致数据库资源占满,引起数据库故障。今天我主要分享一下layering-cache缓存框架在这个三个问题上的实践方案。概念缓存穿透在高并发下,查询一个不存在的值时,缓存不会被命中,导致大量请求直接落到数据库上,如活动系统里面查询一个不存在的......
2018-12-29 10:27:03 1653
原创 系统重构心得
重构概念在不改变软件可观察行为的前提下,对软件内部结构的一种调整,提高其可理解性,降低修改成本。重构节奏测试、小修改、测试、小修改…正是这种节奏让重构得以快速安全而安全的前行。构筑测试体系如果想要重构,我们必须拥有一个良好的测试环境。编写优良的测试程序,可以极大的提升编程速度和代码质量,即使不进行重构也一样如此。每当我们收到一个bug报告时,请先写一个单元测试来暴露bug。测试是一种...
2018-12-25 00:28:41 419 1
原创 CompletableFuture get方法一直阻塞或抛出TimeoutException
问题描述最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响应很慢进而影响了其他系统的调用。问题分析首先我们知道CompletableFuture的get()方法值会阻塞主线程,直到子线程执行任务...
2018-12-16 01:32:26 19547 4
原创 Hystrix实现主线程和子线程的ThreadLocal上下文传递
问题描述我在使用日志链路追踪的时候(基于SLF4J MDC机制实现日志的链路追踪),我发现使用Hystrix线程池隔离的时候,我不能将子线程没有复制主线程的MDC上下文(Slf4j MDC机制),导致日志链路断掉。问题分析Hystrix的线程池隔离是使用HystrixThreadPool来实现的。而获取HystrixThreadPool是在HystrixConcurrencyStrateg...
2018-12-16 01:30:31 2544 2
原创 Gradle 换阿里仓库
改单个项目在项目的build.gradle文件中,修改repositories配置,将mavenCentral()改为 maven{ url ‘http://maven.aliyun.com/nexus/content/groups/public/’}, 如:repositories { maven { url 'http://maven.aliyun.com/nexus/conten...
2018-10-18 16:55:58 2203
转载 如何发布Jar包到Maven中央仓库
转:https://blog.csdn.net/huangjinjin520/article/details/789157891、在网站https://issues.sonatype.org/secure/Dashboard.jspa注册一个账号(请记住对应的账号和密码,之后需要用到)此外,Sonatype还提供了一个名为OSS 的系统,具体的构件发布是在这个oss系统上,...
2018-08-26 22:18:13 5733
转载 将项目发布到 Maven 中央仓库踩过的坑
转:http://brianway.github.io/2017/05/17/release-to-maven-central-repo/大致步骤注册 Sonatype 的账户。地址:https://issues.sonatype.org/secure/Signup!default.jspa 提交发布申请。创建 Issue 地址:https://issues.sonatype.or...
2018-08-26 22:14:17 6073 5
转载 VMware中CentOS设置静态IP
转: https://www.cnblogs.com/zhanjindong/p/3250393.html首先关闭VMware的DHCP:Edit->Virtual Network Editor选择VMnet8,去掉Use local DHCP service to distribute IP address to VMs选项。点击NAT Settings查看一下GATEWA...
2018-08-25 22:02:55 308
转载 VMware安装CentOS后网络设置
转:https://www.cnblogs.com/owaowa/p/6123902.html 在使用CentOS虚拟机后,出现了无法上网的情况,使用主机ping虚机地址可以ping通,而虚机ping不通主机,同时虚机也无法ping通其他的网址或ip,显示内容为Network is unreachable,后来经过在网上查找找到采用NAT模式的解决方法,解决问题,记录如下:1、打开服务...
2018-08-25 22:01:17 434
原创 RabbitMQ 延迟队列
问题描述在订单系统,当用户下单后需要在10分钟内完成支付,否则取消订单。解决方案如果我们使用定时任务来做,那这个失效时间对不准确,当时可以提高定时任务的执行频率来减小这个误差。使用延迟队列,我们这里主要将这种方式。基本概念所谓的‘延迟队列“就是消息被发送以后,不直接被消费者消费,而是等到特定时间后消费者才能拿到消息消费。延迟队列模型详细说明...
2018-06-08 20:44:05 2475
转载 Intellij IDEA神器居然还有这些小技巧
转至:https://blog.csdn.net/linsongbin1/article/details/80211919概述Intellij IDEA真是越用越觉得它强大,它总是在我们写代码的时候,不时给我们来个小惊喜。出于对Intellij IDEA的喜爱,我决定写一个与其相关的专栏或者系列,把一些好用的Intellij IDEA技巧分享给大家。本文是这个系列的第一篇,主要介绍一些你可能不知道...
2018-06-07 09:35:26 888
转载 Intellij IDEA神器那些让人爱不释手的小技巧
转至:https://blog.csdn.net/linsongbin1/article/details/80560332?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io概述在2018年5月6日写了一篇介绍IntellIJ IDEA的文章,Intellij IDEA神器居然还有这些小技巧,主要是列出一些平时大家...
2018-06-07 09:34:12 346
原创 基于SLF4J MDC机制实现日志的链路追踪
问题描述最近经常做线上问题的排查,而排查问题用得最多的方式是查看日志,但是在现有系统中,各种无关日志穿行其中,导致我没办法快速的找出用户在一次请求中所有的日志。问题分析我们没办法快速定位用户在一次请求中对应的所有日志,或者说是定位某个用户操作的所有日志,那是因为我们在输出的日志的时候没把请求的唯一标示或者说是用户身份标示输出到我们的日志中,导致我们没办法根据一个请求或者用户身份标示...
2018-06-06 13:00:33 6847
原创 Slf4j MDC机制
MDC 简介MDC ( Mapped Diagnostic Contexts ),它是一个线程安全的存放诊断日志的容器。 Logback设计的一个目标之一是对分布式应用系统的审计和调试。在现在的分布式系统中,需要同时处理很多的请求。如何来很好的区分日志到底是那个请求输出的呢?我们可以为每一个请求生一个logger,但是这样子最产生大量的资源浪费,并且随着请求的增多这种方式会将服务器资源消...
2018-06-03 21:45:09 15178 1
原创 查看线上日志常用命令
cat 命令(文本输出命令)通常查找出错误日志 cat error.log | grep 'nick' , 这时候我们要输出当前这个日志的前后几行:显示file文件里匹配nick那行以及上下5行cat error.log | grep -C 5 'nick'显示nick及前5行cat error.log | grep -B 5 'nick' cat error.lo...
2018-05-18 16:10:34 7783 1
转载 quartz定时任务中常用的cron表达式
转至:https://blog.csdn.net/xiaopihai86/article/details/50756306在线生成器:http://cron.qqe2.com/corn表达式CronTrigger配置完整格式为: [秒] [分] [小时] [日] [月] [周] [年]字段 允许值 允许的特殊字符秒 0-59 , - * /分 0-59 , - * /小时 0-23 , - * /...
2018-05-08 11:18:43 718
转载 使用Guava retryer优雅的实现接口重调机制
转至:https://www.cnblogs.com/jianzh5/p/6651799.html使用Guava retryer优雅的实现接口重调机制 API 接口调用异常, 网络异常在我们日常开发中经常会遇到,这种情况下我们需要先重试几次调用才能将其标识为错误并在确认错误之后发送异常提醒。guava-retry可以灵活的实现这一功能。Guava re
2018-05-05 21:40:13 1029
转载 Spring异常重试框架 Spring Retry
转至:https://www.cnblogs.com/EasonJim/p/7684649.htmlSpring Retry支持集成到Spring或者Spring Boot项目中,而它支持AOP的切面注入写法,所以在引入时必须引入aspectjweaver.jar包。快速集成的代码样例:@Configuration@EnableRetrypublic c
2018-05-05 21:37:41 1821
转载 spring-retry重试与熔断详解
转至:http://www.broadview.com.cn/article/233本文是《亿级流量》第6章 超时与重试机制补充内容。spring-retry项目实现了重试和熔断功能,目前已用于SpringBatch、Spring Integration等项目。RetryOperations定义了重试的API,RetryTemplate提供了模板实现,线程安全的
2018-05-05 21:35:48 5309
转载 Hystrix的资源隔离策略
转至:https://blog.csdn.net/liuchuanhong1/article/details/73718794Hystrix的资源隔离策略有两种,分别为:线程池和信号量。说到资源隔离,那我们就要明白,我们为什么需要资源隔离。在一个分布式系统中,服务之间都是相互调用的,如下图所示:例如,我们容器(Tomcat)配置的线程个数为1000,
2018-04-17 16:43:05 903 2
转载 深入分析 ThreadLocal 内存泄漏问题
转自:http://blog.xiaohansong.com/2016/08/06/ThreadLocal-memory-leak/文章目录1. 前言2. ThreadLocal 实现原理3. ThreadLocal为什么会内存泄漏 3.1. 为什么使用弱引用4. ThreadLocal 最佳实践前言ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,
2018-04-09 17:22:01 584
consul_1.7.3_windows\mac\linux.zip
2020-06-02
git-flow-plus-4idea-1.0.7.zip
2020-05-07
ScreenToGif.rar
2020-03-13
logback 中文手册
2017-03-30
汽车电子控制系统实例
2012-08-25
CAN技术规范
2012-08-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人