细数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等
加入一个场景:需要用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等
相关文章推荐
- Atitit.线程 死锁 跑飞 的检测与自动解除 与手动解除死锁 java c# .net php javascript.
- Java线程:线程交互
- Java线程(九):Semaphore-信号灯机制
- java中的线程安全
- JAVA多线程Thread setPriority 设置线程优先级方法入门详解
- 【线程】Java线程(1)-线程基本理解and实现方式
- Java线程:线程的同步与锁
- Java线程:Callable和Future
- Java多线程-新特性-有返回值的线程
- Java多线程开发系列之四:玩转多线程(线程的控制2)
- JAVA线程队列BlockingQueue
- 【Java 语言】Java 多线程 一 ( 线程启动 | 线程中断 )
- 【Java基础】线程笔记——多线程交互:线程阀
- JAVA--线程wait()、lnotify()和notifyAll()方法
- java线程并发
- JAVA编程思想学习总结:第21章第1-2节基本的线程机制
- java中线程的使用(未完)
- Java 线程 —— 基础篇
- 介绍 — Java 6中的线程优化
- 简单线程系列7-Java+Mysql可能会出问题