自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

吹雪的专栏

下雨初晴,水风清;烟敛云收,数峰青。

  • 博客(132)
  • 资源 (12)
  • 收藏
  • 关注

原创 2021-05-16

最近在学习Go语言的特性,看到一个并发的例子特别有意思,在此记录下func makeThumbnails(filenames <-chan string) int64 { sizes := make(chan int64) var wg sync.WaitGroup // number of working goroutines for f := range filenames { wg.Add(1) //Add, which increments the counter, must be

2021-05-16 21:39:28 140 1

转载 缓存与数据库一致性

1.使用缓存的场景缓存是提高系统读性能的常用技术,尤其对于读多写少的应用场景,使用缓存可以极大的提高系统的性能.例子:查询用户的存款: select money from user where uid = YYY;为了优化该查询功能,我们可以在缓存中建立uid-&gt;money的键值对。减少数据库的查询压力。2.读操作流程目前数据库和缓存中都有存储数据,当读取数据的时候,流程如下。...

2018-10-15 17:20:35 390

翻译 Java内存模型

前言我们先来看一个反常识的例子。int a=0, b=0;public void method1() { int r2 = a; b = 1;}public void method2() { int r1 = b; a = 2;}这里我定义了两个共享变量 a 和 b,以及两个方法。第一个方法将局部变量 r2 赋值为 a,然后将共享变量 b 赋值为 1。第二个方法...

2018-10-15 16:17:40 315

翻译 垃圾回收_下

前言在读博士的时候,我曾经写过一个统计 Java 对象生命周期的动态分析,并且用它来跑了一些基准测试。其中一些程序的结果,恰好验证了许多研究人员的假设,即大部分的 Java 对象只存活一小段时间,而存活下来的小部分 Java 对象则会存活很长一段时间。之所以要提到这个假设,是因为它造就了Java虚拟机的分代回收思想。简单来说,就是将堆空间划分为两代,分别叫做新生代和老年代。新生代用来存储新建...

2018-10-15 11:41:44 279

原创 垃圾回收_上

前言你应该听说过这么一句话:免费的其实是最贵的。Java 虚拟机的自动内存管理,将原本需要由开发人员手动回收的内存,交给垃圾回收器来自动回收。不过既然是自动机制,肯定没法做到像手动回收那般精准高效 [1] ,而且还会带来不少与垃圾回收实现相关的问题。接下来的两篇,我们会深入探索 Java 虚拟机中的垃圾回收器。今天这一篇,我们来回顾一下垃圾回收的基础知识。引用计数法与可达性分析垃圾回收,...

2018-10-15 10:21:06 276

原创 Java对象的内存布局

前言在 Java 程序中,我们拥有多种新建对象的方式。除了最为常见的 new 语句之外,我们还可以通过反射机制、Object.clone 方法、反序列化以及 Unsafe.allocateInstance 方法来新建对象。其中,Object.clone方法和反序列化通过直接复制已有的数据,来初始化新建对象的实例字段。Unsafe.allocateInstance方法则没有初始化实例字段,而ne...

2018-10-15 09:37:14 941

原创 JVM是如何实现反射的

前言反射是 Java 语言中一个相当重要的特性,它允许正在运行的 Java 程序观测,甚至是修改程序的动态行为。举例来说,我们可以通过 Class 对象枚举该类中的所有方法,我们还可以通过 Method.setAccessible(位于 java.lang.reflect 包,该方法继承自 AccessibleObject)绕过 Java 语言的访问权限,在私有方法所在类之外的地方调用该方法。...

2018-10-13 20:38:09 2262 2

原创 Java虚拟机是怎么实现synchronized的

synchronized字节码在 Java 程序中,我们可以利用 synchronized 关键字来对程序进行加锁。它既可以用来声明一个 synchronized 代码块,也可以直接标记静态方法或者实例方法。当声明 synchronized 代码块时,编译而成的字节码将包含 monitorenter 和 monitorexit 指令。这两种指令均会消耗操作数栈上的一个引用类型的元素(也就是 s...

2018-10-13 11:32:45 528

原创 HSF学习总结

HSF其实是一个RPC框架,RPC是Remote Procedure Call,就是远程服务调用.这个功能为什么要写个框架而不是十几行代码呢,因为在分布式场景下并不是这种点对点通讯的模式。rpc要素:where how地址:注册中心ConfigServer, 这个中心用来管理整个分布式集群里所有的服务对应服务提供者ip的对应关系,这玩意是不能写在配置文件里的,在分布式场景下扩容、缩容机器i...

2018-10-12 19:56:59 3101

原创 TDDL思考总结

单机数据库分布式数据库TDDL原理与最佳实践1. 数据库的结构1.1. KV存储(id是K)1.2. B+树与红黑树B+树的特点是叶子节点是块状,一个叶子里面有多个数据,相邻数据是存在一起的,123,456起等,而磁盘也是按块的,B+树的数据是按块存储的正好和磁盘的块的概念是相符的,所以在数据库里面大多采用了B+树或者类似的一种结构来存储数据。在java中实现treemap时选择...

2018-10-12 19:55:55 588

原创 Java之Integer#highestOneBit代码品读

/** * Returns an {@code int} value with at most a single one-bit, in the * position of the highest-order ("leftmost") one-bit in the specified * {@code int} value. Returns zero if the specified va...

2018-10-12 19:52:35 382

转载 MySQL实现分组排序

想要根据用户分组,以该用户的下单时间为降序,提取所有用户的第二个订单信息。这属于分组排序,在Oracle有内置函数可以实现,而在mysql就有点麻烦:CREATE TABLE user_orders (orders_id INT UNSIGNED NOT NULL,user_id INT UNSIGNED NOT NULL,add_time INT UNSIGNED NOT NULL,P...

2018-10-12 19:45:36 1718 1

转载 metaq最佳实践

1. 前言本文档旨在描述RocketMQ使用过程中的一些最佳实践,建议用户这样做,但是非必须。2. Producer最佳实践2.1 发送消息注意事项一个应用尽可能用一个Topic,消息子类型用tags来标识,tags可以由应用自由设置。只有发送消息设置了tags,消费方在订阅消息时,才可以利用tags在broker做消息过滤。message.setTags(“TagA”)...

2018-10-09 22:17:49 1133

原创 metaq原理简介

1. 前言本文档旨在描述RocketMQ的多个关键特性的实现原理,并对消息中间件遇到的各种问题进行总结,阐述RocketMQ如何解决这些问题。文中主要引用了JMS规范与CORBA Notification规范,规范为我们设计系统指明了方向,但是仍有不少问题规范没有提及,对于消息中间件又至关重要。RocketMQ并不遵循任何规范,但是参考了各种规范与同类产品的设计思想。产品发展历史大...

2018-10-09 22:17:41 867

原创 metaq杂记

Name Server:维护broker的地址列表,以及topic和topic对应的队列的地址列表。每个broker与每个Name Server之间使用长连接来保持心跳,并向其定时注册topic信息。可以从两个维度来理解Name Server的能力: 1)Name Server可以提供一个特定的topic对应的broker地址列表;2)Name Server可以提供一台broker上包含的所有to...

2018-10-09 22:14:34 904

原创 NIO与IO区别

流与块的比较原来的 I/O 库(在 java.io.*中) 与 NIO 最重要的区别是数据打包和传输的方式。正如前面提到的,原来的 I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。面向流的I/O系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分,这样也是相...

2018-10-09 22:09:11 172

原创 ClassNotFoundException和NoClassDefFoundError区别

ClassNotFoundException:它是Exception,不是Error在Throwable体系中只是一个Exception,说明它是可恢复的发生的时机当应用试图通过给定的name加载对应的class时可能抛出此异常,找不到对应的class文件时抛出。常见的场景就是:调用class的forName方法时,找不到指定的类ClassLoader 中的 findSystemCl...

2018-10-09 22:08:30 198

转载 Future模式

1. Future模式简介Future模式就是,当某一程序提交请求,期望得到一个答复。但是可能服务器程序对这个请求的处理比较慢,因此不可能马上收到答复。但是,在传统的单线程环境下,调用函数是同步的,它必须等到服务程序返回结果,才能继续进行其他处理。而Future模式下,调用方法是异步的,原本等待返回的时间段,在主调函数中,则可以处理其他的任务。传统的串行程序如下图所示:https://imag...

2018-09-29 21:28:52 280

转载 HSF原理简介

0. 前言HSF是一个分布式的远程服务调用框架,其实我更喜欢把分布式几个字去掉,因为HSF本身并不是一个单独的服务(指一个进程),他是附属在你的应用里的一个组件,一个RPC组件(远程过程调用——Remote Procedure Call,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发分布式应用更加容易...

2018-08-05 17:35:18 824

转载 HSF原理分析

1. HSF的基本概念HSF全称为High-Speed Service Framework,旨在为淘系的应用提供一个分布式的服务框架,HSF从分布式应用层面以及统一的发布/调用方式层面为大家提供支持,从而可以很容易的开发分布式的应用以及提供或使用公用功能模块,而不用考虑分布式领域中的各种细节技术,例如远程通讯、性能损耗、调用的透明化、同步/异步调用方式的实现等等问题。2. 知识准备...

2018-08-05 17:34:19 637

转载 服务容错模式

0.背景随着服务框架和服务治理体系的逐步成熟,服务化已成为系统设计的趋势。随着业务复杂度的增加,依赖的服务也逐步增加,出现了不少由于服务调用出现异常问题而导致的重大事故,如: 1)系统依赖的某个服务发生延迟或者故障,数秒内导致所有应用资源(线程,队列等)被耗尽,造成所谓的雪崩效应 (Cascading Failure),导致整个系统拒绝对外提供服务。 2)系统遭受恶意爬虫袭击,在放大效应下...

2018-08-05 17:33:25 681

转载 Java并发之AQS详解

1. 概述谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch…。以下是本文的目录大纲: * 概...

2018-08-05 17:31:44 222

转载 常用缓存系统使用经验总结

0. 前言缓存系统是提升系统性能和处理能力的利器,常用的缓存系统各自的特性和使用场景有所不同,这里总结下常用缓存系统时需要关注的点以及解决方案,以及业务中缓存系统的选型等。本文内容主要包括以下: * 缓存使用中需要注意的点:热点、惊群、击穿、并发、一致性、预热、限流、序列化、压缩、容灾、统计、监控。 * spring cache、分布式锁。1、常用缓存系统在平常的业务开发过...

2018-07-30 23:13:13 1056

转载 同步、异步、阻塞与非阻塞

1 同步与异步首先来解释同步和异步的概念,这两个概念与消息的通知机制有关。也就是同步与异步主要是从消息通知机制角度来说的。1.1 概念描述所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后, 依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要...

2018-07-30 23:12:21 301

原创 Redis 和 IO 多路复用

最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutiplexing)部分的实现非常干净和优雅,在这里想对这部分的内容进行简单的整理。几种 I/O 模型为什么 Redis 中要使用 I/O 多路复用这种技术呢?首先,Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的, 但是由于读写操作...

2018-07-30 23:11:16 1931

原创 IO多路复用之select、poll、epoll

IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。目前支持I/O多路复用的系统调用有 select,pselect,poll,epoll,I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就...

2018-07-30 23:09:32 379

转载 memcached与redis的实现对比

0. 前言memcached和redis,作为近些年最常用的缓存服务器,相信大家对它们再熟悉不过了。前两年还在学校时,我曾经读过它们的主要源码,如今写篇笔记从个人角度简单对比一下它们的实现方式,权当做复习, 有理解错误之处,欢迎指正。1. 综述读一个软件的源码,首先要弄懂软件是用作干什么的,那memcached和redis是干啥的?众所周知,数据一般会放在数据库中,但是查询数据会相...

2018-07-30 23:07:58 186

转载 redis线程模型

0. 前言Redis 基于 Reactor 模式开发了自己的网络事件处理器: 这个处理器被称为文件事件处理器(file event handler):文件事件处理器使用 I/O 多路复用(multiplexing)程序来同时监听多个套接字, 并根据套接字目前执行的任务来为套接字关联不同的事件处理器。 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(writ...

2018-07-30 23:06:02 236

原创 Tair-淘宝自主开发的一个分布式key/value存储系统

0. 简介tair 是淘宝自己开发的一个分布式 key/value 存储引擎. tair 分为持久化和非持久化两种使用方式. 非持久化的 tair 可以看成是一个分布式缓存. 持久化的 tair 将数据存放于磁盘中. 为了解决磁盘损坏导致数据丢失, tair 可以配置数据的备份数目, tair 自动将一份数据的不同备份放到不同的主机上, 当有主机发生异常, 无法正常提供服务的时候, 其于的...

2018-07-20 08:43:20 766

原创 CLH队列锁

1. NUMA与SMPSMP(Symmetric Multi-Processor),即对称多处理器结构,指服务器中多个CPU对称工作,每个CPU访问内存地址所需时间相同。其主要特征是共享,包含对CPU,内存,I/O等进行共享。SMP的优点是能够保证内存一致性,缺点是这些共享的资源很可能成为性能瓶颈,随着CPU数量的增加,每个CPU都要访问相同的内存资源,可能导致内存访问冲突,可能会导致CPU资...

2018-07-20 08:41:54 426

原创 Java未开源的Unsafe类

0. 前言Unsafe类可以为我们提供高效并且线程安全方式操作变量,直接和内存数据打交道。1. 获取Unsafe实体的方法private static Unsafe getUnsafeInstance() throws SecurityException, NoSuchFieldException, IllegalArgumentException, ...

2018-07-20 08:41:04 374

原创 Java接口限流算法

0. 前言常见的限流算法有:令牌桶、漏桶。计数器也可以进行粗暴限流实现。1. 算法介绍1.1 令牌桶算法令牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。令牌桶算法的描述如下: * 假设限制2r/s,则按照500毫秒的固定速率往桶中添加令牌; * 桶中最多存放b个令牌,当桶满时,新添加的令牌被丢弃或拒绝; * 当一个n个字节大小的数据包到达,将从桶中删...

2018-07-20 08:39:55 2769

转载 Java锁优化思路及JVM实现

1. 锁优化的思路和方法这里提到的锁优化,是指在阻塞式的情况下,如何让性能不要变得太差。但是再怎么优化,一般来说性能都会比无锁的情况差一点。 这里要注意的是,在ReentrantLock中的tryLock,偏向于一种无锁的方式,因为在tryLock判断时,并不会把自己挂起。 锁优化的思路和方法总结一下,有以下几种。 * 减少锁持有时间 * 减小锁粒度 * 锁分离 * 锁粗化 * ...

2018-07-15 17:49:01 489

转载 Java之Lock的实现原理

0. 前言与synchronized不同的是,Lock完全用Java写成,在java这个层面是无关JVM实现的。 在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadWriteLock(实现类ReentrantReadWriteLock),其实现都依赖java.util.concurrent.AbstractQueue...

2018-07-15 17:48:06 263

转载 Java之synchronized的实现原理

0. 前言目前在Java中存在两种锁机制:synchronized和Lock, Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理。数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CP...

2018-07-15 17:46:52 917

原创 检查异常和未检查异常不同之处

public class ExceptionTypeTest { public void doSomething()throws ArithmeticException{ System.out.println(); } public static void main(){ ExceptionTypeTe...

2018-07-15 17:45:41 365

转载 Java 6中的synchronized

0. 前言在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁, 但是随着Java SE1.6对Synchronized进行了 各种优化 之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中 为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁, 以及锁的存储结构和升级过程。1. 术语定义 术语 英文 说明...

2018-07-15 17:44:22 165

原创 Java 偏向锁

Java偏向锁(Biased Locking)是Java6引入的一项多线程优化。它通过消除资源无竞争情况下的同步原语,进一步提高了程序的运行性能。 偏向锁,顾名思义,它会偏向于第一个访问锁的线程,如果在接下来的运行过程中,该锁没有被其他的线程访问,则持有偏向锁的线程将永远不需要触发同步。 如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会尝试消除它身上的偏向锁,将锁恢...

2018-07-15 17:43:14 1023

转载 透彻的掌握 Spring 中@transactional 的使用

0. 前言Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于@Transactional 注解...

2018-07-15 17:41:42 335

转载 全面分析 Spring 的编程式事务管理及声明式事务管理

0. 前言本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务。 通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之。1. Spring 事务属性分析事务管理对于企业应用而言至关重要。它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性。就像银行的自助取款机,通常都能正常为客户服务,但是...

2018-07-15 17:39:44 126

疯狂HTML5-CSS3-JavaScript讲义 .part2

疯狂HTML5-CSS3-JavaScript讲义 这是part2 总共2个part

2014-04-04

疯狂HTML5-CSS3-JavaScript讲义

疯狂HTML5-CSS3-JavaScript讲义 这是part1,部共两个part

2014-04-04

python基础教程

Python编程入门(适合于零基础朋友)

2014-03-30

带书签 算法导论(第三版)中文版

带书签 算法导论(第三版) 这是第三部分 总共三个

2014-03-20

带书签 算法导论(第三版)

带书签 算法导论(第三版) 这是第二部分 总共三个

2014-03-20

深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)

最新第二版 深入理解Java虚拟机:JVM高级特性与最佳实践 因为文件有点大,这是第二部分,总共两个

2014-03-20

深入理解Java虚拟机:JVM高级特性与最佳实践(最新第二版)

最新第二版 深入理解Java虚拟机:JVM高级特性与最佳实践 因为文件有点大,这是第一部分,总共两个

2014-03-20

算法导论 第三版 中文版

这是第二部分,建议三个部分都下载完后再解压!

2014-03-06

分布式操作系统讲义

分布操作系统讲义,本讲义详细的讨论了分布式的各个基本组成部分及面临的问题,并提出了几个思考题供读者思考。

2012-10-28

information research

information research and the web resource find.

2010-09-12

网络资源检索的相关课件

网络资源检索的课件,而且有相当多的外文网站可供参考。

2010-09-12

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除