理解Java-Reference

最近重读《深入理解Java虚拟机》,讲到Java中的几种引用类型,结合源码总结梳理一遍。

引用类型

JDK1.2之后,Java扩充了引用的概念,将引用分为强引用、软引用、弱引用和虚引用四种。

  • 强引用

    类似于”Object a = new Object()”这类的引用,只要垃圾强引用存在,垃圾回收器就不会回收掉被引用的对象。

  • 软引用

    对于软引用关联的对象,在系统将要发生内存溢出异常之前,会把这些对象列入垃圾回收范围中进行回收。如果这次回收还没有足够内存,则抛出内存异常。

    使用SoftReference类实现软引用

  • 弱引用

    强度比软引用更弱,被弱引用关联的对象只能存活到下一次垃圾回收发生之前。当发生GC时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。

    使用WeakReference类实现弱引用

  • 虚引用

    一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用取得一个对象的实例。为一个对象设置虚引用关联的唯一目的就是能够在这个对象被垃圾回收器回收掉后收到一个通知。

    使用PhantomReference类实现虚引用

阅读全文 »

如何执行一个延迟任务?

背景

前段时间做到临时版本管理系统的项目中有这样一个需求:

最新发布的版本发布记录状态为未处理,用户手动确认后状态修改为已处理。超过七天后状态为未处理的记录状态自动修改为过期提醒,同时向用户发送一封邮件。

“修改状态为过期提醒” 的任务就是一个延迟任务,如何执行这样一个任务呢?思考了两种方案:

轮询

启动一个定时任务,每隔一天执行一次,执行的内容如下:

  1. select id from release where status = 2 and release_time > 7days

  2. update release set status = 3 where id in (…)

  3. 向用户发送过期通知邮件(可以交给专门的线程去做)

阅读全文 »

大型网站技术架构

最近在读李智慧所著的《大型网站技术架构》,这是我第二遍读这本书,很好的一本书,让人开拓了视野。

原著分为四部分,分别包括大型网站架构演进、大型网站架构模式、大型网站核心要素以及大型网站案例。我把第二三部分做成了思维导图,就当做是读书笔记好了。
点击图片下方的链接可以查看大图,思维导图工具使用XMind.

大型网站架构模式

阅读全文 »

认识MVCC

前一篇总结提到了数据库事务的隔离性可以由锁机制来实现。锁是传统数据库控制事务并发的主要手段,这里提到的锁(S锁和X锁)可以认为是悲观锁,在对数据实现读写之前加上相应的锁,实现了独占访问机制,从而控制并发行为。神通数据库7.0主要使用了锁来实现事务并发控制。

那么数据库事务的并发控制还有其他的实现方式吗?当然是有的。去年刚推出的神通数据库8.0,就使用了MVCC(Multiversion Concurrency Control) 即多版本控制来控制事务的并发行为。

研究一下什么是MVCC…

MVCC

多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是,把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能.

多版本并发控制,意味着同一时刻看到的相同行的数据可能是不一样的,即一个行可能有多个版本.有点平行宇宙的意思。要实现这种效果,需要做一些操作:

  • 对于每一行记录,新增两个隐藏列:

    行的更新时间(创建版本号)

    行的删除时间(删除版本号)

  • 数据版本

    同一行数据,在同一时刻对于不同的事务,可能看到不同的版本。即同一行数据有多个版本同时存在。

  • 事务版本

    每个事务有其唯一的事务版本号

  • 版本有序

    无论是数据版本,还是事务版本,其版本号随时间增长而增长,即版本号是递增的。

阅读全文 »

数据库事务浅析

ACID

一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的:

  1. 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
  2. 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。

上面对数据库事务的定义摘自维基百科。先不用着急的去理解这个定义的具体含义,我们从事务的四个特性来逐步了解什么是事务。

数据库事务拥有以下四个特性,习惯上被称之为ACID特性。

  1. 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

  2. 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。

  3. 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

  4. 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。

阅读全文 »

Java读取资源文件

写java代码时常常需要加载一些外部的资源,通常我们会使用全路径名加载一份资源,比如:C:\Users\Yukai\Desktop\abc.jpg . 但是,有些时候我们需要加载的是源代码路径下的资源或者配置文件等等,更习惯于使用相对路径,或者直接给一个文件名,就希望能够找到我们需要的配置文件。如何做到?常见的方法是使用了 class.getResource 或 classloader.getResource

class.getResource && classloader.getResource ?

这两个方法看起来很相似,他们直接有什么区别?

直接上网搜索能够得到一些答案,但都不如查看源代码来的直接:

阅读全文 »

使用maven打包

前段时间做的web项目涉及到了打包的问题,记录一下使用maven打包的过程…

项目打包为fatjar

什么是fatjar?做过java项目的都知道,一个项目从开发到部署,一般需要经过打包,把一些资源文件和类文件压缩到一块,形成一个单独的文件,叫做jar(或者war)。如果这个项目依赖了一些第三方的jar包,在最终的部署阶段,这些jar有两种存在方式:

  • 一种是单独放到一个与项目jar包并行的文件夹中(一般叫做lib),然后使用-classpath将这个文件夹下的jar加入到classpath
1
2
3
4
5
6
7
8
---
|--VersionManager.jar
|
|--lib
|
|--a.jar
|
|--b.jar

阅读全文 »