无锁编程的原理和应用 一、基于锁的编程的缺点在传统的多线程编程中,多线程之间一般用各种锁的机制来保证正确的对共享资源进行访问和操作。只要需要共享某些数据,就应当将对它的访问串行化。比如像++count(count是整型变量)这样的简单操作也得加锁,因为即便是增量操作这样的操作,实际上也是分三步进行的:读、改、写(回)。在使用锁机制的过程中,即便在锁的粒度、负载、竞争、死锁等需要重点控制的方面解决的很好,也无法彻...
Java从基础到架构总结 一、数据结构和算法常用数据结构 数组:大小固定的数据结构。顺序存储,随机访问。链表:链表存储,顺序访问。主要有循环单链表,双向链表,循环双向链表。堆:二叉堆。栈:又叫LIFO表,后进先出。限制插入和删除只能在栈顶进行操作。队列:又叫FIFO表,先进先出。限制删除只能在对头进行操作,插入只能在队尾进行操作。二叉树算法思想 算法分析:按照时间复杂度和空间复杂度。算法思想:递推、...
关系型数据库设计总结 一、设计阶段流程规划阶段:主要工作是对数据库的必要性和可行性进行分析。确定是否需要使用数据库,使用哪种类型的数据库,使用哪个数据库产品。概念阶段:主要工作是收集并分析需求。识别需求,主要是识别数据实体和业务规则。对于一个系统来说,数据库的主要包括业务数据和非业务数据,而业务数据的定义,则依赖于在此阶段对用户需求的分析。需要尽量识别业务实体和业务规则,对系统的整体有初步的认识,并理解数据的流...
Java并发包之Lock锁和Condition条件 一、Synchronizedsynchronized是Java的一个关键字,也就是Java语言内置的特性,如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,执行代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而获取锁的线程释放锁会有三种情况: 1. 获取锁的线程执行完该代码块,然后线程释放对锁的占有。 2. 线程执行发生异常,此时JVM会让线程自动释放锁。...
Java并发包之闭锁/栅栏/信号量 一、Java多线程总结:描述线程的类:Runable和Thread都属于java.lang包。内置锁synchronized属于jvm关键字,内置条件队列操作接口Object.wait()/notify()/notifyAll()属于java.lang包。提供内存可见性和防止指令重排的volatile属于jvm关键字。而java.util.concurrent包(J.U.C)中包含的是...
Java异常的设计原则 原文地址:https://www.jianshu.com/p/1e0199e3c34e每个软件都可能遇到异常,所以从设计阶段就要考虑异常处理的问题,纳为业务流程的一部分。异常是需要妥善处理的,但是处理的前提是发现异常,而发现异常的前提的对异常有清楚的认识,我们要先认识到程序中都有什么样的异常(定义异常),然后在程序结构中检测和抛出异常(捕获异常),最后用恰当的业务流程去分别处理(处理异常)...
spring原理总结 Spring中的Scope的作用Scope为对象在Spring容器中的创建方式,也可以理解为对象在容器中的生命周期。Scope的类型有:Single、Prototype、Request、Session、Global Session五种: Single:单例模式,从容器启动到第一次getBean被实例化后,就一直存在于容器中,知道容器退出或销毁。Prototype:多例模式,每次getB...
系统设计总结 不好的设计的几个特性:僵化性:很难对系统进行改动,因为每个改动都会迫使许多对系统其他部分的改动。脆弱性:对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出现问题。牢固性:很难解开系统的纠结,使之成为一些可在其他系统重用的组件。粘滞性:做正确的事情比做错误的事情要困难。不必要的复杂性:设计中包含有不具任何直接好处的基础结构。不必要的重复:设计中包含有重复的结构,而该重复的结...
大流量和高并发应对手段总结 大流量和高并发的常规应对手段扩容、动静分离、缓存、服务降级和限流。限流的常用算法和实践思路目前主流的算法主要有三种:令牌桶算法、漏桶算法和计数器算法。 令牌桶算法:主要限制流量的流入速率,允许出现一定程度的突发流量。Nginx的限流模块就是使用的这种算法实现的。 每秒会有r个令牌按照固定速率放入桶中。桶的容量是固定不变的,如果桶满了再放入令牌,则溢出。若桶中的可用令牌不足...
导致系统性能卡又慢的原因汇总(不断补充) 系统的配置参数没有正确配置,如数据库,redis等。具体可以参考:项目性能优化参数配置汇总TCP的配置,在特定的场景中,有可能会遇到延迟的ACK,它会限制链路上所发送的数据包,每秒钟只会有2-5个数据包。这是因为TCP两个算法所引起的死锁:Nagle以及TCP Delayed Acknowledgement。在200-500ms的超时之后,会打破这个死锁,但是微服务之间的通信却会分别受到影响。...
项目性能优化参数配置汇总 nginx(在nginx.conf配置文件里面)worker_processes:启动进程,跟CPU核数相同。worker_connections:单个进程的最大并发数,所以nginx的最大并发数即worker_processes*worker_connections。tomcat(server.xml)protocol:服务器协议,目前我们使用的是Http11AprPro...
netty原理总结(未完、待续) UNIX提供了5中I/O模型阻塞I/O模型:在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才返回,期间会一直阻塞等待。非阻塞I/O模型:recvfrom从应用层到内核的时候,如果缓冲区没有数据,就返回一个EWOULDBLOCK错误,然后一直轮询检查这个状态,看内核是不是有数据到来。I/O复用模型: select/poll:进程通过将...
mysql总结 MySQL Query Optimizer基本工作原理当客户端向MySQL请求一条Query,命令解析器模块完成请求分类,区别出是SELECT并转发给MySQL Query Optimizer时,MySQL Query Optimizer首先会对整条Query进行优化,处理掉一些常量表达式的预算,直接换算成常量值。并对Query中的查询条件进行简化和转换,如去掉一些无用或显而易见的条件、结构调...
java虚拟机JVM总结 内存模型:程序计数器、虚拟机栈、本地方法栈、堆、方法区(永久代)程序计数器(counter) 线程私有。是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。唯一一个在Java 虚拟机规范中没有规定任何OutOfMemoryError情况的区域。虚拟机栈(VM stack) 线程私有,使用连续的...
nginx原理总结 nginx后端节点健康检查主要有三种实现方式: 1. 本身自带的ngx_http_proxy_module模块和ngx_http_upstream_module模块,惰性检测。ngx_http_proxy_module:proxy_connect_timeout(与后端服务器建立连接的超时时间)、proxy_read_timeout(从后端服务器读取响应的超时)和proxy_next_up...
《亿级流量网站架构核心技术》总结 nginx后端节点健康检查主要有三种实现方式: 1. 本身自带的ngx_http_proxy_module模块和ngx_http_upstream_module模块,属于惰性检测。 ngx_http_proxy_module:proxy_connect_timeout(与后端服务器建立连接的超时时间)、proxy_read_timeout(从后端服务器读取响应的超时)和proxy_next...
《人人都是架构师》总结 警惕Dubbo因超时和重试引起的系统雪崩超时时间一定要设置,要根据业务场景而定,设置太短容易引发重试,设置太长容易引发请求堆积。超时设置过短的后果:Dubbo默认失败重试2次,所以假设有1000个并发,都超时了,则会重试2次,变成3000个请求,导致请求流量翻了3倍。重试设置:写服务一般要考虑幂等性,所以失败后不进行重试。Dubbo重试的集中容错方案: failover(失败重试其他...
《JAVA程序性能优化》总结 设计优化单例模式:延时加载(内部类)。反射和序列化会破坏单例代理模式:延时加载 静态代理:包括主题接口、真实主题、代理类、main。初始化时使用代理,真正使用时再通过代理加载真实主题。动态代理:jdk动态代理、CGLIB、javassist基于动态代码的代理、ASM。动态加载过程(以CGLIB为例): 根据指定的回调类生成class字节码,并保存在byte数组中。通过反射,调用C...
《构建高性能web站点》总结 数据发送的过程(从主机到线路的过程)应用程序首先将数据写到该进程的地址空间中。应用程序通过系统函数库接口向内核发出系统调用,系统内核将这些数据从用户态内存复制到内核缓冲区中。(内核缓冲区大小有限,所有数据都以队列的方式进入这里)。数据写入内核缓冲区后,内核通知网卡控制器来取数据,将数据复制到网卡的缓冲区中。网卡缓冲区将要发送出去的数据进行字节到位的转换(二进制),然后依次发出。...
消息队列原理总结 消息队列应用的场景业务解耦:消息队列要解决的最本质问题,实现设计的单一性原则,不耦合其他模块的业务。最终一致性:用来处理延迟不那么敏感的“分布式事务”场景或者不重要的业务。广播:下游有很多系统关心你的系统发出的通知的时候。错峰和流控:上下游系统处理能力存在差距的时候,利用消息队列做一个通用的“漏斗”。在下游有能力处理的时候,再进行分发。为什么消息队列需要broker(消息队列...