您的位置:首页 > 编程语言 > Java开发

细数Java线程中的工具包

2013-10-22 00:33 288 查看
如果用Java多深层次的开发,比如负载均衡、网络程序、底层监控平台、调度算法之类;或者如果用Java编写数据库引擎,必须利用Java的线程库来提升系统的吞吐量。

加入一个场景:需要用Java编写一个类似Hive的东西,在一堆分布式的文件系统上,构建一个类似Mysql的数据库存储系统,试想一下需要多少东西需要思考:

做个假设如下:

1:首先实现对SQL语法的词法分析、语法分析

2:对SQL语句的连接、子查询、谓词、分组、排序、去重等进行执行计划分析

3:执行具体的SQL执行计划,而执行的过程可以作为主要的设计范畴

4:将执行结果排序、去重、然后返回给客户端程序

具体的1、2、4暂时不做考虑,如果单单拿第3个来设计分析的话,至少要兼顾如下问题:

a: 解决多个并发请求对同一个表的操作,比如写、读操作同时进行,需要引入锁的管理机制

b:在一个请求处理中,需要涉及多个表的Join和连接操作,如何快速的将数据加载到内存进行连接操作,而且或者根据需要进一步进行排序、分组、去重等

c:如果涉及的表的大小超过内存大小,不可能将数据都加载到内存中,借助于索引来完成查找或者排序,以及连接等

d:针对一个查询请求,可能有多重执行算法,如何找出那个是最优的,根据CBO或者RBO来优化

当然后续的a/b/c/d的问题,很多人决定已经有现成的产品,何苦自己来发明轮子呢,在这里只是想就问题来进一步挖掘Java的工具包如何能够帮助我们实现需求;

言归正传:

Java早期版本1.4之前的线程工具类:

Thread,Runnable

Wait,Join,Notify,NotifyAll,Sleep

synchronzied

这些工具类如果要来实现简单的多线程,可能满足需求,如果来实现并发查询的锁控制功能呢?

wait,notify,synchronized可以作为基础的防止并发、等待锁释放、唤醒等待队列的方法,但是这几个方法的粒度可能比较基础

synchronized可以使用于方法、实例级别

如果对应发杂的锁机制可能难以实现

比如:意向共享锁、行级别的意向排他锁

如何进一步控制呢?

Java.util.concurrency提供了一些易用而且简单的工具

1:识别正确的并发的Collection 容器和数据结构【用来设计作为底层的存储容器】

Queues,BlockingQueues,ConcurrentHashMap

2:正确保证线程执行的Executors

3:线程池【构建可靠的多线程分析】

4:锁和条件Locks Conditions【构建锁的机制】

5:同步器 Semaphores,Barriers【保证事务的可靠性】

6:原子变量 用于低粒度的比较和设置操作

7:更细粒度的时间

接下来了解一下包:

ljava.util.concurrent
提供通用的线程编程的工具比如:多种队列策略,Bounded buffers,Sets,Maps,Thread Pools
ljava.util.concurrent.atomic
提供Lock_free 线程安全的编程,比如Atomic Integers,Atomic boolean等
ljava.util.concurrent.locks
提供锁比如 read-write锁,Condition variables等
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: