
java
文章平均质量分 82
qq_43171869
小刀爱编程,爱学习,分享一些知识给大家
展开
-
详谈分布式最终一致性
“什么是分布式系统?这取决于看系统的角度。对于坐在键盘前使用IBM个人电脑的人来说,电脑不是一个分布式的系统。但对于在电脑主板上趴着的虫子来说,这台电脑就是一个分布式系统。” —— Leslie Lamport 引言分布式一致性问题随处可见,任何一个实体/联接模型,都可能存在分布式一致性问题。如果把单机拆开来看,CPU、内存、I/O设备组成的机箱本身就是一个小型的分布式系统,需要确保对...原创 2018-11-29 20:53:48 · 1371 阅读 · 0 评论 -
怎样实际项目中运用责任链模式
1 模式概要1.1 简介责任链模式为请求创建一个接收者对象链,每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把请求传给下一个接收者,依此类推 责任链模式避免了请求的发送者和接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连成一条链,并且沿着这条链传递请求,直到有对象处理它为止。1.2 责任链模式优缺点优点降低耦合度。它将请求的发送者和接收者解...原创 2018-12-11 19:28:27 · 414 阅读 · 0 评论 -
来看看Redis 集群分布式锁与 API 网关分布式限流
Redis 集群的历史Redis 在 3.0 前一般有两种集群方案,一是 proxy(Twemproxy、Codis),二是使用 Sentinel(哨兵)。 通过 Sentinel 是一种使用哨兵来达到高可用的方案,而 proxy 是用于在前置上进行 sharding 用代理给后端的 redis 集群的方案,达到负载均衡的方案,在单个分片的 redis 中作主从。 因为本文要重点讲解的不是 3...原创 2018-12-28 19:49:21 · 406 阅读 · 0 评论 -
Java的内部类其实不难理解
01 前言昨天晚上,我把车停好以后就回家了。回家后才发现手机落在车里面了,但外面太冷,冷到骨头都能感受到寒意——实在是不想返回一趟去取了(小区的安保还不错,不用担心被砸车玻璃),于是打定主意过几个小时的“世外桃源”生活——别人找不到我,我也找不到别人,这种与世隔绝的状态非常适合读书写作。把厚厚的《Java编程思想》摆在桌子上,正襟危坐,认认真真地读起了第十章——内部类。尽管我已经非常耐心和...原创 2018-12-28 21:04:19 · 195 阅读 · 0 评论 -
老板!你确定要让我写个 BUG吗!
前言标题没有看错,真的是让我写个 bug!刚接到这个需求时我内心没有丝毫波澜,甚至还有点激动。这可是我特长啊;终于可以光明正大的写 bug 了原创 2018-12-28 21:19:22 · 208 阅读 · 0 评论 -
年后跳槽怕面试不过关?搞懂并发编程,轻松应对80%的面试场景
作为一个合格的Java程序员,必须要对并发编程有一个深层次的了解,在很多互联网企业都会重点考察这一块。可能很多工作3年以上的Java程序员对于这一领域几乎没有太多研究。所以在接下来内容中,我会将并发编程整个领域由浅到深做非常全面的分析。内容导航从操作系统的发展了解进程、线程模型 线程的优势 线程的生命周期 线程的应用场景了解进程、线程模型每次学习一个新技术,我会先去了解这个技术...原创 2018-12-28 21:23:54 · 135 阅读 · 0 评论 -
Java并发之AQS源码分析
AQS 全称是 AbstractQueuedSynchronizer,顾名思义,是一个用来构建锁和同步器的框架,它底层用了 CAS 技术来保证操作的原子性,同时运用了 CLH 同步队列作同步器,这也是 ReentrantLock、CountDownLatch 等同步工具实现同步的底层实现机制。它能够成为实现大部分同步需求的基础,也是 J.U.C 并发包同步的核心基础组件。说是框架,其实就是一个...原创 2019-01-10 21:26:47 · 283 阅读 · 0 评论 -
来玩一下Java设计模式之命令模式
wiki上的描述 Encapsulate a request as an object, thereby allowing for the parameterization of clients with different requests, and the queuing or logging of requests. It also allows for the support of und...原创 2019-01-23 20:56:15 · 208 阅读 · 0 评论 -
Java消息系统简单设计与实现
前言:由于导师在我的毕设项目里加了消息系统(本来想水水就过的..),没办法...来稍微研究研究吧..简单简单...需求分析我的毕设是一个博客系统,类似于简书这样的,所以消息系统也类似,在用户的消息里包含了有:喜欢和赞、评论、关注、私信这样的一类东西,这样的一个系统应该包含以下的功能: 当用户 评论/关注/点赞 时能够 通知 到被评论/关注/点赞的用户,并生成像如下格式的提示信息(允许...原创 2019-01-08 19:37:26 · 8405 阅读 · 0 评论 -
JVM 中的守护线程
特点通常由JVM启动运行在后台处理任务,比如垃圾回收等用户启动线程执行结束或者JVM结束时,会等待所有的非守护线程执行结束,但是不会因为守护线程的存在而影响关闭。判断线程是否为守护线程判断一个线程是否为守护线程,主要依据如下的内容/* Whether or not the thread is a daemon thread. */private boolean daemo...原创 2018-12-17 19:26:36 · 772 阅读 · 0 评论 -
面试阿里常被问到的十个 Java 面试题
1. 以满分十分来评估自己——你有多擅长 Java?如果你并不完全确信你自己或是你对 Java 的熟练程度,那么这会是一个非常棘手的问题。如果有这种情况,你应该把打分调低一点。之后,你大概会得到与你承认的水平相符的问题。因此,假如你给自己满分,却不能回答一个有点难的问题,那将会对你不利。2. 阐述 Java 7 和 Java 8 的区别。实话说,两者有很多不同。如果你能列出最重要的,应...原创 2018-12-22 16:01:26 · 656 阅读 · 0 评论 -
看看阿里如何做到百万量级硬件故障自愈?
1.背景1.1.面临挑战对于承载阿里巴巴集团95%数据存储及计算的离线计算平台MaxCompute,随着业务增长,服务器规模已达到数十万台,而离线作业的特性导致硬件故障不容易在软件层面被发现,同时集团统一的硬件报障阈值常常会遗漏一些对应用有影响的硬件故障,对于每一起漏报,都对集群的稳定性构成极大的挑战。针对挑战,我们面对两个问题:硬件故障的及时发现与故障机的业务迁移。下面我们会围绕这两...原创 2018-11-26 22:10:05 · 493 阅读 · 0 评论 -
Java核心-反射和动态代理(JDK Proxy和Cglib)
反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多。要怎么理解以上这句话,请看下文。一、反射反射机制是 Java 语言提供的一种基础功能,赋予程序在运行时 自省 (introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构...原创 2018-11-27 19:40:24 · 493 阅读 · 0 评论 -
带你解密因特网级别的负载均衡常用手段
如果你是早期的云计算服务提供商,你可以使用一个单独的客户 web 服务器,为它分配一个 IP 地址,并配置一个 DNS(域名系统)记录来将它与一个易读的名字关联起来,之后通过 BGP(边界网关协议)来传播 IP 地址,这是种在网络间交换路由信息的标准方式。在冗余的网络路径上分发流量,在不可用的基础设施周围进行路由来提高可用性(会导致不对称路由等现象),这些从本质上讲并不是负载均衡。简单的 ...原创 2018-11-27 19:53:46 · 188 阅读 · 0 评论 -
都别争了!分布式锁也是锁
Tomcat的锁Tomcat是这个系统的核心组成部分, 每当有用户请求过来,Tomcat就会从线程池里找个线程来处理,有的执行登录,有的查看购物车,有的下订单,看着属下们尽心尽职地工作,完成人类的请求,Tomcat就很有成就感。与此同时,它也很得意,所有的业务逻辑尽在掌握。MySQL算啥!不就是一个保存数据的地方吗? Redis算啥!不就是一个加快速度的缓存吗?没有他们,我也能找到替代...转载 2018-11-28 19:29:03 · 266 阅读 · 0 评论 -
分享Java 中如何运行字符串表达式?
在日常的开发中,偶尔会遇到运行字符串表达式的情况,通常这样的需求会对需求进行进一步分析,然后进行进一步 “特殊化”,最后直接写到硬代码中,这样做的话,就不太好扩展了;也有另外的处理方式是采用 Java 内置的 JavaScript 引擎等运行字符串表达式,但是内置引擎也有弊端,比如频繁运行片段式的字符串的效率非常低,并且与 Java 之间的数据交互比较麻烦,于是,便产生了写一个“字符串表达式计算引...原创 2018-11-28 20:39:58 · 471 阅读 · 0 评论 -
十年架构师不到400行手写一个Spring MVC
人见人爱的Spring已然不仅仅只是一个框架了。如今,Spring已然成为了一个生态。但深入了解Spring的却寥寥无几。这里,我带大家一起来看看,我是如何手写Spring的。我将结合对Spring十多年的研究经验,用不到400行代码来描述SpringIOC、DI、MVC的精华设计思想,并保证基本功能完整。首先,我们先来介绍一下Spring的三个阶段,配置阶段、初始化阶段和运行阶段(如图):...原创 2018-12-19 17:15:36 · 892 阅读 · 0 评论 -
分享一个今日头条的面试题——LRU原理和Redis实现
很久前参加过今日头条的面试,遇到一个题,目前半部分是如何实现 LRU,后半部分是 Redis 中如何实现 LRU。我的第一反应该是内存不够的场景下,淘汰旧内容的策略。LRU ... Least Recent Used,淘汰掉最不经常使用的。可以稍微多补充两句,因为计算机体系结构中,最大的最可靠的存储是硬盘,它容量很大,并且内容可以固化,但是访问速度很慢,所以需要把使用的内容载入内存中;内存速度...原创 2018-12-20 19:25:42 · 2370 阅读 · 0 评论 -
Java 静态代理和动态代理的使用及原理解析
代理模式是软件开发中常见的设计模式,它的目的是让调用者不用持有具体操作者的引用,而是通过代理者去对具体操作者执行具体的操作。静态代理的实现操作接口:public interface Operate { void doSomething();}复制代码操作者:public class Operator implements Operate { @Overr...原创 2018-12-26 21:17:31 · 194 阅读 · 0 评论 -
深入理解Java自带的线程池和缓冲队列
前言线程池是什么线程池的概念是初始化线程池时在池中创建空闲的线程,一但有工作任务,可直接使用线程池中的线程进行执行工作任务,任务执行完成后又返回线程池中成为空闲线程。使用线程池可以减少线程的创建和销毁,提高性能。举个例子:我是一个包工头,代表线程池,手底下有若干工人代表线程池中的线程。如果我没接到项目,那么工人就相当于线程池中的空闲线程,一但我接到了项目,我可以立刻让我手下的工人去工作...原创 2019-01-09 16:36:14 · 492 阅读 · 0 评论 -
Java集合框架详解
一、Java集合框架概述集合可以看作是一种容器,用来存储对象信息。所有集合类都位于 java.util 包下,但支持多线程的集合类位于 java.util.concurrent 包下。数组与集合的区别如下:1)数组长度不可变化而且无法保存具有映射关系的数据;集合类用于保存数量不确定的数据,以及保存具有映射关系的数据。2)数组元素既可以是基本类型的值,也可以是对象;集合只能保...转载 2019-01-15 19:32:29 · 117 阅读 · 0 评论 -
JAVA线程池原理源码解析—为什么启动一个线程池,提交一个任务后,Main方法不会退出?
public static void main(String[] args) { ExecutorService service = Executors.newFixedThreadPool(10); service.submit(() -> System.out.println("Hello ")); System.out.pr...原创 2019-01-22 21:01:51 · 3041 阅读 · 1 评论 -
金九银十,每天还在增删查改,怎么看透JVM本质?
前言JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。java编译器只需面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译器,编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。这里就给大家讲一下JVM。...原创 2019-09-21 20:23:41 · 147 阅读 · 0 评论 -
金九银十,正在面试吗?面试官必问:JVM架构解读,查漏补缺
来源:www.codeceo.com前言每个Java开发人员都知道字节码由JRE(Java运行时环境)执行。但许多人不知道JRE是Java Virtual Machine(JVM)的实现,它分析字节码,解释代码并执行它。作为开发人员,我们应该知道JVM的架构是非常重要的,因为它使我们能够更有效地编写代码。在本文中,我们将更深入地了解Java中的JVM架构和JVM的不同组件。什...原创 2019-09-23 17:27:13 · 141 阅读 · 0 评论 -
SpringBoot启动Tomcat
来源:https://my.oschina.net/luozhou/blog/3088908前言我们知道SpringBoot给我们带来了一个全新的开发体验,我们可以直接把web程序达成jar包,直接启动,这就得益于SpringBoot内置了容器,可以直接启动,本文将以Tomcat为例,来看看SpringBoot是如何启动Tomcat的,同时也将展开学习下Tomcat的源码,了解Tomc...原创 2019-09-23 20:39:21 · 189 阅读 · 0 评论 -
连接器在Tomcat中是如何设计的
来源:https://my.oschina.net/luozhou/blog/3097513上期回顾上一篇文章《SpringBoot启动Tomcat》从main方法启动说起,窥探了SpringBoot是如何启动Tomcat的,在分析Tomcat中我们重点提到了,Tomcat主要包括2个组件,连接器(Connector)和容器(Container)以及他们的内部结构图,那么今天我们来分析...原创 2019-09-23 22:13:35 · 173 阅读 · 0 评论 -
金九银十,查漏补缺:JVM的内存区域是怎样划分的?
出处:http://www.cnblogs.com/dolphin0520/学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看...原创 2019-09-24 15:04:25 · 111 阅读 · 0 评论 -
金九银十,查漏补缺:JVM内存模型
来源:https://juejin.im/post/5ad5c0216fb9a028e014fb63JVM回顾 JVM = 类加载器(classloader) + 执行引擎(execution engine) + 运行时数据区域(runtime data area)运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数...原创 2019-09-26 15:10:29 · 137 阅读 · 0 评论 -
金九银十,查漏补缺:JVM常见面试题解析
前言总结了JVM一些经典面试题,分享出我自己的解题思路,希望对大家有帮助,有哪里你觉得不正确的话,欢迎指出,后续有空会更新。1.什么情况下会发生栈内存溢出。思路: 描述栈定义,再描述为什么会溢出,再说明一下相关配置参数,OK的话可以给面试官手写是一个栈溢出的demo。我的答案:栈是线程私有的,他的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作...原创 2019-09-27 14:46:27 · 301 阅读 · 0 评论 -
金九银十,查漏补缺:Java线程同步与实现
前言为何要使用Java线程同步? Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时,将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,从而保证了该变量的唯一性和准确性。但其并发编程的根本,就是使线程间进行正确的通信。其中两个比较重要的关键点,如下:线程通信:重点关注线程同步的几种方式; 正确通信:重点关注是否有...原创 2019-09-27 21:28:13 · 278 阅读 · 0 评论 -
秋招开始了,读《深入理解JVM虚拟机》总结
重读 JVM秋招开始了,前面由于做别的事耽误了半个月,以前学的东西不用就很容易忘记。所以,这次重新阅读《深入理解 JVM 虚拟机》时,想做一个记录。将碎片的知识整合,方便自己以后阅读,同时也和大家一起分享。内容中会添加我自己的理解,其中如果有错误,欢迎大家指正。1. Java 内存区域与内存溢出异常1.1 运行时数据区域根据《Java 虚拟机规范(Java SE 7 版)》规...原创 2019-09-21 17:04:33 · 184 阅读 · 0 评论 -
百因必有果,JVM调优(工具篇)建议收藏
18年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化。工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题,长长可以到达事半功倍的效果来。jvm监控分...原创 2019-09-21 16:26:50 · 438 阅读 · 0 评论 -
55道Java经典面试题+答案(全)
这套面试题主要目的是帮助那些还没有java软件开发实际工作经验,而正在努力寻找java软件开发工作的朋友在笔试时更好地赢得笔试和面试。1 、一个 ".java" 源文件中是否可以包括多个类(不是内部类)?有什么限制?可以有多个类,但只能有一个 public 的类,并且 public 的类名必须与文件名相一致。2 、 Java 有没有 goto?java 中的保留字,现在没有在 ja...原创 2019-01-22 21:16:48 · 464 阅读 · 0 评论 -
教你怎么样在 Java8 中优雅的避开空指针异常
要说 Java 编程中哪个异常是你印象最深刻的,那 NullPointerException 空指针可以说是臭名昭著的。不要说初级程序员会碰到, 即使是中级,专家级程序员稍不留神,就会掉入这个坑里。Null 引用的发明者Tony Hoare 曾在 2009 年作出道歉声明,声明中表示,到目前为止,空指针异常大约给企业已造成数十亿美元的损失。下面是 Tony Hoare 的原话:我将 N...原创 2019-01-22 21:22:33 · 3446 阅读 · 0 评论 -
Java-深入HashMap原理及内部存储结构
本文将通过如下简单的代码来分析HashMap的内部数据结构的变化过程。public static void main(String[] args) { Map<String, String> map = new HashMap<>(); for (int i = 0; i < 50; i++) { map.put("key" + ...原创 2019-01-22 21:31:12 · 2439 阅读 · 0 评论 -
Nginx源码阅读笔记-内存池的设计
nginx的内存池设计的比较简单了,一个内存池中分为两个部分:超过max大小的内存分配,走大块内存分配,这部分内存管理由ngx_pool_large_t结构体负责。 否则就是在ngx_pool_t遍历符合要求的ngx_pool_t结构体,找到符合要求大小的pool直接返回,否则就申请一块新的内存pool。nginx中所有请求都单独对应一个内存池,在这个请求的过程中,所有涉及到内存分配的地方...原创 2019-02-14 21:56:00 · 212 阅读 · 0 评论 -
还是自己撸一个java的mvc框架吧!
怎么写呢?因为在之前写代码的时候,我把每个类要做的事情分的比较清楚,所以在添加这个功能的时候写起来还是比较简单的,需要修改的地方也比较小。这一章里我们需要干的事情有: 定义一个注解,标识某一个class中的被添加注解的方法是一个 UrlMethodMapping 。 修改配置文件,添加需要扫描的 package 。 写一个方法,根据 package 中值找到其中 ...原创 2019-02-13 21:40:57 · 258 阅读 · 0 评论 -
Dubbo 源码分析 - 服务引用
1. 简介本文分析服务引用的原理。在 Dubbo 中,我们可以通过两种方式引用远程服务。第一种是使用服务直联的方式引用服务,第二种方式是基于注册中心进行引用。服务直联的方式仅适合在调试或测试服务的场景下使用,不适合在线上环境使用。因此,本文我将重点分析通过注册中心引用服务的过程。从注册中心中获取服务配置只是服务引用过程中的一环,除此之外,服务消费者还需要经历 Invoker 创建、代理类创建等...原创 2019-09-10 22:15:39 · 132 阅读 · 0 评论 -
探索Java字节码如何增强
1.字节码1.1 什么是字节码?Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统、平台都进行了定制,二是因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供JVM使用。因此,也可以看出字节码对于Java生态的重要性。之所以被称之为字节码,是因为字节码文件由十六进制值组成,而JVM以两个十六进制值为一组,即以字节为单位进行读取。在Java中一般是用...原创 2019-09-12 10:52:19 · 265 阅读 · 0 评论 -
查漏补缺,JVM系列:(JVM内存组成及分配)
java内存组成介绍:堆(Heap)和非堆(Non-heap)内存按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用...原创 2019-09-21 15:41:59 · 121 阅读 · 0 评论