- 博客(55)
- 资源 (18)
- 收藏
- 关注
原创 Hadoop RPC分析 (二) -- Server
[Hadoop RPC服务端:Server]服务端的基本思路可以简述如下:通过网络获取到远程调用相关的信息,找到对应的方法,执行完成后,将结果通过网络发送给客户端。对于服务端,我们将主要关心内部的实现机制,找到服务端处理一次远程调用的整个流程。与Server相关的类主要为下面几个(都是Server的内部类)Server.Listener & Server.Liste
2016-07-25 20:49:12 3490
原创 Hadoop RPC分析(一) -- Client
[Hadoop RPC调用入口]在使用Hadoop RPC基本框架中,主要是通过getProxy来获得一个客户端代理对象,通过这个对象来向服务端发送RPC请求。getProxy有多个重载方法,最终都是调用到了下面这个函数来进行实现(来自org.apache.hadoop.ipc.RPC)publicstatic ProtocolProxy getProtocolProxy(
2016-07-25 20:47:31 4556
原创 MySQL数据库小结---待完善
1、索引mysql基本的索引都是使用B-tree系列来进行存储,例如PK、建表时的INDEX、UNIQUE约束。InnoDB使用的是B+树来存储索引信息。mysql对索引的使用较广: a、找到对应的行 b、简化数据查询量,一次查询中有多个索引可用时,会选择对应数据更少的那个 c、在sort操作中,对group by的指定字段使用索引来进行计算
2016-04-03 17:08:16 2259
原创 ThreadLocal的原理
在多线程环境下,会使用ThreadLocal来保存变量,这样即使在多线程的环境下,也能够以线程安全的方式来使用变量。1、在多线程环境中,使用ThreadLocal来保存变量时,变量是存在什么地方? 简要来说,使用ThreadLocal来保存相关变量时,这个变量是存在当前使用ThreadLocal对象的这个线程中的,也就是当前线程,即Thread.curren
2016-03-05 23:25:35 2405
原创 一个ClassCastException引发的思考
一个ClassCastException引发的思考,在做一个简单的功能试验时,代码抛出了下面的异常明明类的完全限定名是一样的,竟然会转换失败。。。完整的项目代码如下所示import java.io.IOException;import java.util.HashMap;import java.util.Map;import javax.se
2015-11-07 11:27:03 4746 1
原创 Session和Cookie
Session是属于服务器端生成和管理的对象,由于HTTP请求本身是无状态的,因此在服务器端使用Session来管理HTTP请求的状态。服务器端会把session对象存在内存中。Cookie是属于浏览器前端的数据存储方案,数据存储于电脑本地磁盘上,在访问某个域名的服务时,浏览器会自动加载属于当前域的cookie数据,将cookie信息发送到服务器端。[Cookie和
2015-10-27 20:28:50 2273
原创 求解!关于Http和Socket
问题是这样,我写了一个LynnHttpClient的类,还有一个Socket的服务器类。在LynnHttpClient类的main方法中,我使用HttpURLConnection向服务端发了一条记录。但在服务端使用Socket读取数据的时候,为什么要读两次才能把HTTP头和内容读出来。代码如下客户端public class LynnHttpClient { p
2015-09-02 14:43:57 2124 1
原创 tomcat服务器解析(七)-- Processor&Endpoint&ProtocolHandler
请求到达Poller处理,最终是由Processor来进行处理,为了说明这中间过程所涉及的部分,先整理下在tomcat服务的各个组成部分:ProtocolHandler、Endpoint、Endpoint.Handler、Processor它们之间的引用关系如下[ProtocolHandler] org.apache.coyote.ProtocolHan
2015-06-17 20:26:11 5111 2
原创 tomcat服务器解析(六)-- Acceptor
Acceptor负责用来管理连接到tomcat服务器的数量,来看看Acceptor在tomcat服务器中的应用,是如何实现连接管理的,socket连接建立成功之后,是如何实现内容的读写的(读写是交由Poller机制去完成)。先准备一点java nio中实现socket连接所需的基础知识:SocketChannel和ServerSocketChannelSocketChann
2015-06-07 17:41:26 6171
原创 tomcat服务器解析(五)-- Poller
在前面的分析中介绍过,Acceptor的作用是控制与tomcat建立连接的数量,但Acceptor只负责建立连接。socket内容的读写是通过Poller来实现的。 Poller使用java nio来实现连接的管理。关于nio,主要需要明确三个概念:Channel、Selector和SelectionKey.在这里的使用上,它们之间的关系可以简单这样理解,Channel必须
2015-06-05 22:59:07 9700 1
原创 tomcat服务启动解析
[web容器简介]先需要区分几个概念:Web Server 、Web ContainerWeb Server:能够通过HTTP提供服务的进程,可以是一套完整的系统、一个软件等Web Container:管理Java Servlet、JSP的容器,是Web Server的一个组件。一般负责,负责管理servlet的生命周期,url请求映射,请求权限验证等。常见的web容器
2015-05-14 17:25:07 4446
原创 tomcat服务器解析(三)---- Handler for Endpoint
前面的分析到,请求最终被封装成了一个SocketProcessor对象,放在Executors线程池中去执行。这些都还只是在tomcat内部的socket的处理层面上,那请求最终是如何被转到开发人员所写的servlet上的?NioEndpoint.SocketProcessor所做的工作在私有方法doRun中 if (handshake == 0)
2015-05-11 20:15:06 3799
原创 tomcat服务器解析(四) ---- 组成模块分解
前面部分梳理了tomcat服务器处理http请求的一个流程,这里进行内容总结,梳理下在tomcat服务器实现中的,各种功能模块。[Endpoint]Endpoint是基础的网络设施,通过Endpoint来实现网络连接和控制,它是服务器对外I/O操作的接入点。主要任务是管理对外的socket连接,同时将建立好的socket连接交到合适的工作线程中去。content:org.a
2015-05-11 20:13:54 4422
原创 tomcat服务器解析(二) --- Endpoint
Endpoint主要用来提供基础的网络I/O服务,封装了网络通讯相关的细节。在AbstractProtocol中对Endpoint有这样一段注释 /** * Endpoint that provides low - level network I/O - must be matched to the * ProtocolHandler im
2015-05-11 20:12:14 10781 1
原创 tomcat服务器解析(一)
httpservlet自己并不能独立运行,需要依赖于一个web容器才能够运行。维基百科中对httpservlet和web容器的关系做了简要说明 A web container (also known as a servlet container) is essentially the component of a web server that interacts with the s
2015-05-11 20:09:25 4329 2
原创 synchronized锁住了什么
先看一个简单示例,下面这段代码能够正常通过编译。public class SyncTest { public SyncTest syncVar; public static SyncTest syncStaticVar; public static synchronized void testStaticSync() {
2015-03-17 11:12:27 11761
原创 Executor-ThreadPoolExecutor实现
1、ThreadPoolExecutor的主要作用在Oracle中对ThreadPoolExecutor的作用进行了说明:1、在大量的异步任务到达的情况下,使用线程池能够提升性能;2、提供一种资源管理和调度的方法。一般通过Executors的工厂方法来生成一个线程池对象,Executors提供了多种方法来构造不同的线程池:1、带有缓存性质的线程池 Executors.new
2014-12-06 10:23:09 3693
原创 Executor实现----AbstractExecutorService实现分析
1、首先来看一段使用示例 ExecutorService recmdService = Executors. newFixedThreadPool(1); Future> recmdFuture = recmdService.submit( new Callable>() { @Override publi
2014-11-23 14:42:46 6026 2
原创 Executor框架
1、框架定义的接口 Executor框架的接口主要由三个接口定义,Executor、ExecutorService和ScheduledExecutorService Executor是最上层接口,定义了一个Runnable的任务执行的接口 void execute(Runnable command); ExecutorService继承自Executor,在
2014-11-18 19:52:05 1015
原创 Java自旋锁
Linux系统中自旋锁的原理和实现想当复杂,会涉及操作系统、内核等等一系列的东东,Java的自旋锁可以理解成让当前线程不停地在循环体内执行,直到满足线程进入临界区为止。在AbstractQueuedSynchronizer中就有自旋锁的使用,参见 acquireQueued方法final boolean acquireQueued(final Node node,
2014-11-17 20:43:26 2713
原创 共享锁和排它锁(ReentrantReadWriteLock)
1、什么是共享锁和排它锁 共享锁就是允许多个线程同时获取一个锁,一个锁可以同时被多个线程拥有。 排它锁,也称作独占锁,一个锁在某一时刻只能被一个线程占有,其它线程必须等待锁被释放之后才可能获取到锁。2、排它锁和共享锁实例 ReentrantLock就是一种排它锁。CountDownLatch是一种共享锁。这两类都是单纯的一类,即,要么
2014-11-16 14:27:22 16215 1
原创 条件锁
ReentrantLock类有一个方法newCondition用来生成这个锁对象的一个条件(ConditionObject)对象,它实现了Condition接口。Condition提供了线程通讯的一套机制await和signal等线程间进行通讯的方法。。1、适用场景 当某线程获取了锁对象,但因为某些条件没有满足,需要在这个条件上等待,直到条件满足才能够往下继续执行时,就需要
2014-10-30 17:47:55 3890
原创 ReentrantLock解析
最近学习Jdk的源代码时,读到了ConcurrentHashMap的源码实现时,发现每一个分段Segment都是ReentrantLock类型,于是顺带对ReentrantLock的源代码进行了学习。。在这里做一个笔记总结。因为只有在工作之余才能有空看看,所以思路有点零散,仅供参考。。。。1、如何确定哪个线程可重复进入该锁 在获取锁的时候,首先会检查
2014-10-25 10:56:26 20712 1
原创 java线程同步之CountDownLatch
1、类说明jdk的concurrent包中的CountDownLatch类是一个线程同步的辅助类,它使得线程可以一直等待在其它线程中执行的操作,直到此操作结束。CountDownLatch在初始化的时候指定一个大小值N,调用CountDownLatch的await方法的线程会陷入等待之中,直到这个CountDownLatch对象的countDown方法被调用N次为止,无论是在一个线程中调用N次
2014-01-22 16:47:12 1781
原创 Netty的ChannelPipeline
1、如何理解Netty的ChannelPipeline 在Netty中,每个Channel被创建的时候都需要被关联一个对应的pipeline(通道),这种关联关系是永久的(整个程序运行的生命周期中)。ChannelPipeline可以理解成一个消息( 或消息事件,ChanelEvent)流转的通道,在这个通道中可以被附上许多用来处理消息的handler,当消息在这个通道中流转的时候,如
2014-01-16 10:43:43 16019
原创 Netty的ChannelFuture
在Netty中的所有的I/O操作都是异步执行的,这就意味着任何一个I/O操作会立刻返回,不保证在调用结束的时候操作会执行完成。因此,会返回一个ChannelFuture的实例,通过这个实例可以获取当前I/O操作的状态。ChannelFuture为完成或未完成状态。完成和未完成可对应的各种I/O操作结果如下所示 *
2014-01-16 10:42:41 14408
转载 Netty详解
原文链接 http://www.blogjava.net/czihong/articles/391927.htmlNetty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序[官方定义],整体来看其包含了以下内容:1.提供了丰富的协议编解码支持,2.实现自有的buffer系统,减少复制所带来的消耗,3.
2014-01-16 10:41:01 7590 2
原创 Struts2的IoC解析
个人学习笔记,不保证内容的正确率。转载请声明!!对于IoC来说,常见的就是Spring框架的了。并且在目前Java EE开发中,使用SSH框架时,也主要依赖于Spring框架所提供的IoC功能。但Struts2框架本身也提供了IoC的功能。本人对于Spring框架的IoC功能的实现没怎么做了解,所以也不对此发表什么见解。这里主要是对Struts2框架的IoC的使用方法和实现原理
2013-05-18 18:23:32 5995
原创 Struts2缓存解析
缓存在Struts2中起到了重要的作用,Struts2中使用缓存来进行延迟加载。[构成缓存的类和数据结构]构成缓存的类主要是两个类,在com.opensymphony.xwork2.inject.util包中,分别是ReferenceMap和ReferenceCache,其中前者是后者的父类。说起来,这两个类并没有构成一个完整的缓存系统,它还留有一个create接口,用于供使用方来
2013-05-12 10:39:30 6800 1
原创 Struts2的Builder模式解析
Builder设计模式是一种创建型模式,可以将一个复杂对象的构建构成和它的表示区分开来,使得同样的构建过程可以创建出不同的表示。Builder模式的适用场景如下:1、要将创建一个复杂对象的算法与组成这个对象的部分以及组成部分的组合方式相互独立的时候;2、需要构建多种对象的表示时Builder模式的基本结构如下在Builder模式的结构组成中,Buil
2013-05-05 20:18:00 3800 2
原创 Filter and Dispatcher
使用Struts框架时,需要在web应用程序的web.xml文件中增加filter配置。如下代码filter> filter-name> struts filter-name> filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter filte
2013-04-22 17:08:06 2485
原创 ThreadLocal简单学习
学习Struts2时,遇到ThreadLocal,不甚理解,所以对此作了一番学习。ThreadLocal是什么呢?首先这并不是一个线程类,它是用来提供本地线程数据,也就是它保存的数据是线程相关的,每个线程都有一份数据副本,一个线程可以对其保存的副本进行修改,却不会影响其它的线程中的数据。这样说不易理解,比较这三种情况的数据,1、非ThreadLocal类型的静态成员数据;2、非Thre
2013-04-21 19:54:23 1910 1
原创 http请求的参数和属性
练习搭建和使用SSH框架的时候,遇到一个http方面很简单的问题。一个form的表单登录请求,表单为最基本的html表单内容,代码如下在struts的action中需要获取输入的用户名和密码,最开始我采用的代码如下但是在运行的时候,一直在user.setUserName(request.getAttribute("user_name").toString());这里报空指针
2013-04-19 12:53:30 7709
原创 Android测试用例执行线程和UI线程
在做Android的AsyncTask测试的时候,发现测试用例在执行的时候是在一个名为“Instr: android.test.InstrumentationTestRunner”的线程中执行的,而activity是在main线程,个人这里也将其理解成UI线程。对此的原因做一些探究。在Android测试工程的AndroidManifest.xml文件中,instrumentation标
2013-04-11 11:05:53 4441
原创 关于Android程序入口的猜想
对Android程序的入口一直不大理解,因为它不像一般的C、C++或者Java程序有一个main函数入口,在执行的时候可以很清晰地知道程序的整个流程。为此,查了下相关资料,在《Android技术内幕-系统卷》中找到了相关内容,关于整个Android的初始化内容这里就不抄了,主要说下应用程序的执行,书中这样说到“当系统加载完所有的服务之后会处于等待状态,等待程序运行。但是,每一个应用程序都将启动一个
2013-04-10 20:55:15 997
原创 Linux内存管理
Linux 0.11的内存管理总结。。。许多其它内容参见“地址翻译”部分1、分页相关的页目录表和页表 Linux 0.11中的内存管理是分页式的内存管理。程序中的逻辑地址,在经过地址翻译后会被转成线性地址。内存管理部分所接触的地址,基本上都以线性地址为主。 在分页式的内存管理中,将物理内存看成是一个个的连续的页组成。在Linux 0.11中,这个页的大小是4KB。因此,
2013-01-14 19:43:47 2200 1
原创 i节点
以Linux 0.11为实例,兴趣所至,个人总结,不保证正确性。。。[i节点] i节点是表征文件的方式,因此在linux 0.11内核中,有一系列专门操作i节点的函数,在fs/inode.c中。与i节点进程同步相关的函数,主要是wait_on_inode、lock_inode和unlock_inode,这几个函数都比较简单。以lock_inode函数为例,sta
2013-01-06 13:58:18 3425 2
原创 Linux文件系统概述
以Linux 0.11为实例,个人总结,不保证正确性。。。[文件系统]磁盘上的数据以块为单位进行读写,每一个块称为一个逻辑块。在理解磁盘的逻辑视图时,以逻辑块为单位来理解。磁盘上数据按照使用情况分,可以分成以下几个部分:引导块、超级块、i节点位图区、逻辑块节点位图区、i节点区、数据区引导块中是整个系统的启动代码,只有用于启动的文件系统才有数据,其它的文件系统这个块没有数据(
2013-01-05 13:44:11 1547
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人