Java-ForkJoin框架

分治思想

分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。

分治法在每一层递归上都有三个步骤:

  • 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;

  • 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题

  • 合并:将各个子问题的解合并为原问题的解。

阅读全文 »

Java基础-字节

这两天在实施一个加密通信方案时,涉及到了字节的读写和转换,有一些知识点需要学习和记录下来…

原码 反码 补码

原码:第一位表示符号,其余位表示数值。比如8位2进制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

第一位是符号位,8位2进制的取值范围:

[11111111, 01111111] = [-127, 127]

反码:正数的反码是等于原码,负数的反码是在其原码的基础上,符号位不变,其余位取反:

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

补码:正数的补码等于原码,负数的补码是在其原码的基础上,符号位不变,其余位取反,然后加1:

[+1] = [00000001]原 = [00000001]反 = [00000001]补

[-1] = [10000001]原 = [11111110]反 = [11111111]补

在Java中,存储的数值都是有符号的,同时也是使用补码存储的。

阅读全文 »

理解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

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

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

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

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

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

  • 数据版本

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

  • 事务版本

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

  • 版本有序

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

阅读全文 »