自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zzu-hust-madd

勤用智,智用勤

  • 博客(33)
  • 收藏
  • 关注

原创 第13章 线程安全与锁优化

线程安全 Java语言中的线程安全1.不可变在Java语言中,不可变(Immutable)的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何的线程安全保障措施,在第12章我们谈到final关键字带来的可见性时曾经提到过这一点,只要一个不可变的对象被正确地构建出来(没有发生this引用逃逸的情况),那其外部的可见状态永远也不会改变

2015-09-24 20:47:06 440

原创 第12章 Java内存模型与线程

Java内存模型主内存与工作内存Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量(Variables)与Java编程中所说的变量有所区别,它包括了实例字段、静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为后者是线程私有的,不会被共享,自然就不会存在竞争问题。为了获得较好的

2015-09-24 17:35:24 339

原创 第8章 虚拟机字节码执行引擎

概述执行引擎是Java虚拟机最核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式。运行时栈帧结构栈帧(Stack Fr

2015-09-24 11:09:14 329

原创 第7章 虚拟机类加载机制

类加载的时机类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。什么情况下需要开始类加载过程的第一个阶段:加载?Java虚拟机规范中并没有

2015-09-23 21:57:37 345

原创 第6章 类文件结构

Class类文件的结构魔数与Class文件的版本每个Class文件的头4个字节称为魔数(Magic Number),它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件。很多文件存储标准中都使用魔数来进行身份识别,譬如图片格式,如gif或者jpeg等在文件头中都存有魔数。使用魔数而不是扩展名来进行识别主要是基于安全方面的考虑,因为文件扩展名可以随意地改

2015-09-23 17:02:24 316

原创 第4章 虚拟机性能监控与故障处理工具

JDK的命令行工具jps:虚拟机进程状况工具JDK的很多小工具的名字都参考了UNIX命令的命名方式。jps(JVM Process Status Tool)是其中的典型。除了名字像UNIX的ps命令之外,它的功能也和ps命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class ,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(L

2015-09-23 10:16:11 508

原创 第3章 垃圾收集器与内存分配策略

对象已死吗在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(即不可能再被任何途径使用的对象)。引用计数算法可达性分析算法在主流的商用程序语言的主流实现中,都是称通过可达性分析(Reachable Analysis)来判定对象是否存活的。这个算法的基本思路

2015-09-21 21:14:54 411

原创 第2章 Java内存区域与内存溢出异常

运行时数据区域

2015-09-20 21:52:13 431

原创 第11章 序列化

第74条:谨慎地实现Serializable接口实现Serializable接口而付出的最大代价是,一旦一个类被发布,就大大降低了“改变这个类的实现”的灵活性。第二个代价是,它增加了出现Bug和安全漏洞的可能性。第三个代价是,随着类发行新的版本,相关的测试负担也增加了。为了继承而设计的类应该尽可能少地去实现Serializable接口,用户的接口也应该尽可能少地继承Seri

2015-09-18 16:44:21 336

原创 第10章 并发

第66条:同步访问共享的可变数据你可能听说过,为了提高性能,在读或写原子数据的时候,应该避免使用同步。这个建议是非常危险而错误的。虽然语言规范保证了线程在读取原子数据的时候,不会看到任意的数值,但是它并不保证一个线程写入的值对于另一个线程将是可见的。为了在线程之间进行可靠的通信,也为了互斥访问,同步是必要的。这归因于Java语言规范中的内存模型(memory model),它规

2015-09-18 16:12:34 468

原创 第9章 异常

第57条:只针对异常的情况才使用异常对于“状态测试方法”和“可识别的返回值”这两种做法,有些指导原则可以帮助你在两者之中做出选择。如果对象将在缺少外部同步的情况下被并发访问,或者可被外界改变状态,使用可被识别的返回值可能是很有必要的,因为在调用“状态测试”方法和调用对应的“状态相关”方法的时间间隔之中,对象的状态有可能会发生变化。如果单独的“状态测试”方法必须重复“状态相关”方

2015-09-17 17:07:22 313

原创 第8章 通用程序设计

第45条:将局部变量的作用域最小化要使局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方声明。几乎每个局部变量的声明都应该包含一个初始化表达式。第46条:for—each循环优先于传统的for循环for-each循环在简洁性和预防Bug方面有着传统的for循环无法比拟的优势,并且没有性能损失。应该尽可能地使用for-each循环。遗憾的是,有三

2015-09-17 15:43:47 331

原创 第7章 方法

第38条:检查参数的有效性每当编写方法或者构造器的时候,应该考虑它的参数有哪些限制。应该把这些限制写到文档中,并且在这个方法体的开头处,通过显示的检查来实施这些限制。养成这样的习惯是非常重要的。只要有效性检查有一次失败,你为必要的有效性检查所付出的的努力便都可以连本带利地得到偿还了。第39条:必要时进行保护性拷贝假设类的客户端会尽其所能来破坏这个类的约束条件

2015-09-16 21:56:06 312

原创 第6章 枚举和注解

第30条:用enum代替int常量枚举类型(enum type)是指由一组固定的常量组成合法值的类型。Java枚举类型背后的基本想法非常简单:它们就是通过公有的静态final域为每个枚举常量导出实例的类。因为没有可以访问的构造器,枚举类型是真正的final。因为客户端既不能创建枚举类型的实例,也不能对它进行扩展,因此很可能没有实例,而只有声明过的枚举常量。换句话说,枚举类型是实

2015-09-15 22:07:38 408

原创 第5章 泛型

第23条:请不要在新代码中使用原生态类型声明中具有一个或者多个类型参数的类或者接口,就是泛型类或者接口。每种泛型定义一组参数化的类型,构成格式为:先是类或是接口的名称,接着用尖括号(最后一点,每个泛型都定义一个原生态类型(raw type),即不带任何实际类型参数的泛型名称。如果使用原生态类型,就失掉了泛型在安全性和表述性方面的所有优势。如果List这样的原生态类型,就

2015-09-13 21:14:51 390

原创 第4章 类和接口

第13条:使类和成员的可访问性最小化第14条:在公有类中使用访问方法而非公有域毫无疑问,说到公有类的时候,坚持面向对象程序设计思想的看法是正确的:如果类可以在它所在的包的外部进行访问,就提供访问方法,以保留将来改变该类的内部表示法的灵活性。如果公有类暴露了它的数据域,要想在将来改变其内部表示法是不可能的,因为公有类的客户端代码已经遍布各处了。第15条:使可变

2015-09-11 20:54:50 331

原创 第3章 对于所有对象都通用的方法

第8条:覆盖equals时请遵守通用约定覆盖equals方法看起来似乎很简单,但是有许多覆盖方式会导致错误,并且后果非常严重。最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下,类的每个实例都只与它自身相等。如果满足了以下任何一个条件,这就正是所期望的结果:类的每个实例本质上都是唯一的。对于代表活动实体而不是值(value)的类来说确实如此,例如Thread。Ob

2015-09-11 16:41:52 312

原创 第2章 创建和销毁对象

第一条:考虑用静态工厂方法代替构造器类可以通过静态工厂与设计模式来提供它的客户端,而不是通过构造器。提供静态工厂方法而不是公有的构造器,这样做具有几大优势。静态工厂方法与构造器不同的第一大优势在于,它们有名称。如果构造器的参数本身没有确切地描述正被返回的对象,那么具有适当名称的静态工厂更容易使用,产生的客户端代码也更于阅读。

2015-09-11 15:26:39 352

原创 第11章 设备驱动

概述设备驱动在本质上就是一种软件程序,上层软件可以在不用了解硬件特性的情况下,通过设备驱动提供的接口和计算机硬件进行通信。为方便我们加入各种驱动以支持不同硬件,内核抽象出了很多层次结构,这些层次结构是设备驱动的上层。它们抽象出各种驱动接口,相应驱动只需要填写相应的回调函数,就能很容易把新的驱动加入到Linux内核。一般来说,设备驱动可以分为下面3类(1)块设备驱动(bl

2015-09-10 15:02:11 277

原创 第10章 文件管理

概述文件Linux中文件的概念并不局限于普通的磁盘文件,而是指由字节序列构成的信息载体,将I/O设备、套接字等也包括在内。具体来说,Linux文件主要包括如下几类:普通文件:包括文本文件、二进制文件等。目录文件:就是目录,可以使用“mkdir”命令创建。链接文件:链接共分为两种,一种为硬链接,另一种为软链接,其中软链接又称为符号链接。设备文件:Linux

2015-09-09 20:59:09 379

原创 第九章 内存管理

内存概述地址空间内存单元所对应的实际的地址称为物理地址。通常程序操作访问的内存地址称为逻辑地址,CPU通过总线操作的内存地址称为线性地址。分页为了有效管理,物理内存分为固定大小的块,称为帧或页。物理页的大小是由硬件决定的,通常为2的幂,像X86平台为4KB。虚拟地址包含页号和页内偏移,页号作为页表的索引通过MMU映射到物理内存的基地址,再加上页内

2015-09-08 22:03:30 306

原创 第8章 调度

概述多任务系统可分为非抢占式所任务和抢占式多任务。调度策略通常情况下,使用什么样的调度策略与进程的具体类型有关。进程的一种分类方法是CPU消耗型和I/O消耗型。前者需要大量的CPU时间用于数值计算,后者则需要花费很多的时间等待I/O操作的完成。另一种分类方法把进程区分为3种。交互式进程。这类进程需要大量的人机交互,因此会不断地休眠,等待键盘和鼠标输入

2015-09-08 16:39:30 480

原创 第7章 进程管理

概述进程vs程序程序是存储在某种存储介质上的可执行文件,是目标码和用户数据的集合。程序装载进内存后可以执行,处于可执行状态的程序称为进程。但是进程并不仅仅局限于一段可执行代码以及一些用户数据,通常它还要包括很多其他的资源,比如打开的文件、用于保存临时数据的堆栈、挂起的信号等。因此,进程可以看作处于执行状态的程序以及它所包含的资源的总称。从内核的角度来看,进程是操

2015-09-08 10:52:28 302

原创 第6章 中断与中断处理

概述管理系统中存在的各种设备是内核的主要职责,内核一般可以通过两种方式来履行这个职责:轮询:内核以一定的周期访问设备,查询设备的状态并进行处理。中断:设备在需要时通知内核,内核收到设备的请求后再做出相应处理。使用轮询方式时,内核对设备的访问按照一定频率周期地进行,因而常常会出现设备的请求不能得到及时的处理,或者在内核一次又一次的访问中没有发现设备的任何请求,进而

2015-09-07 16:48:52 957

原创 第5章 系统调用

系统调用概述一个稳定运行的Linux操作系统需要内核和用户应用程序之间的完美配合,内核提供各种各样的服务,然后用户应用程序通过某种途径使用这些服务,进而契合用户的不同需求。用户应用程序访问并使用内核所提供的各种服务的途径即是系统调用。在内核和用户应用程序相交界的地方,内核提供了一组系统调用接口,通过这组接口,应用程序可以访问系统硬件和各种操作系统资源。内

2015-09-06 10:41:51 370

原创 第4章 系统初始化

引导过程(1)CPU自身初始化CPU自身的初始化是引导过程的第一步,如果有多个CPU,即多处理器系统,则每个CPU都要进行自身初始化。比如,对于双处理器的Pentium系统,一个CPU总是为主,另外一个CPU总是为辅,主CPU执行引导过程的剩余工作,随后内核才会激活辅CPU。在辅CPU被激活之前,我们可以认为该体统中只有一个CPU可用,而不必考虑另外一个CPU。接下来,

2015-09-02 17:15:15 312

原创 第3章 浏览内核源代码

内核将应用程序和硬件分离开来。内核一方面负责与计算机硬件进行交互,实现对硬件的编程控制和接口操作,调度对硬件资源的访问,另一方面为用户应用程序提供一个高级的执行环境和访问硬件的虚拟接口。部分内核为体系结构和硬件所特有,即体系相关部分;部分内核是可移植的,即体系无关部分。体系无关部分通常会定义与体系相关部分的接口,这样,内核向新的体系结构移植的过程就变成确认这些接口的特性并将它们加以

2015-09-02 16:25:31 335

原创 第3章 浏览内核源代码

2015-09-02 11:14:57 251

原创 第2章 配置与编译内核

配置内核几种配置方式1. make config基于文本的最为传统的也是最为枯燥的一种配置方式,但是它可以适应任何情况。这种方式会为每一个内核支持的特性向用户提问。如果用户回答“y”,则把该特性编译进内核;回答“m”,则该特性作为模块进行编译;回答“n”,则表示不对该特性提供支持。2.make oldconfigmake oldcon

2015-09-02 10:54:25 339

原创 第8章 编程模式与设计模式

编程模式行为隔离内容(HTML);外观(CSS);行为(JavaScript)命名空间为了减少命名冲突,我们通常都会尽量减少使用全局变量的机会。但这并不能根本解决问题,更好的办法是将变量和方法定义在不同的命名空间中。这种方法的实质就是只定义一个全局变量,并将其他变量和方法定义为该变量的属性。初始化分支 我们曾经提到过,不同

2015-09-01 17:25:28 330

原创 第7章 浏览器环境

BOMBOM(即浏览器对象模型)是一个用于访问浏览器和计算机屏幕的对象集合。我们可以通过全局对象window和window.screen来访问这些对象。window对象再探在JavaScript中,每个宿主环境都有一个全局对象。具体到浏览器环境中,这就是window对象了。环境中所有的全局变量实际上都是该对象的属性。window.navigator

2015-09-01 16:40:26 408

原创 第6章 继承

JavaScript中的每个函数中都有一个名为prototype的对象属性。该函数被new操作符调用时会创建出一个对象,并且该对象中会有一个指向其原型对象的秘密链接。通过该秘密链接(在某些环境中,该链接名为_proto_),我们就可以在新建的对象中调用相关原型对象的方法和属性。而原型对象自身也具有对象固有的普遍特征,因此本身也包含了指向其原型的链接。由此就形成了一条链,我们称之为原

2015-09-01 09:56:39 240

原创 第5章 原型

isPrototypeOf()方法每个对象中都会有一个isPrototypeOf()方法,这个方法会告诉我们当前对象是否是另一个对象的原型。在处理原型问题时,我们需要特别注意以下两种行为:当我们对原型对象执行完全替换时,可能会触发原型链中某种异常。prototype.constructor属性是不可靠的。

2015-09-01 08:54:58 281

空空如也

空空如也

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

TA关注的人

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