java多线程和线程池 多线程开发的捷径:构建Java并发模型框架
多线程开发的捷径:构建Java并发模型框架
Java多线程特性为构建高性能的应用提供了极大的方便 但是也带来了不少的麻烦 线程间同步 数据一致性等烦琐的问题需要细心的考虑 一不小心就会出现一些微妙的 难以调试的错误
另外 应用逻辑和线程逻辑纠缠在一起 会导致程序的逻辑结构混乱 难以复用和维护 本文试图给出一个解决这个问题的方案 通过构建一个并发模型框架(framework) 使得开发多线程的应用变得容易
基础知识
Java语言提供了对于线程很好的支持 实现方法小巧 优雅 对于方法重入的保护 信号量(semaphore)和临界区(critical section)机制的实现都非常简洁 可以很容易的实现多线程间的同步操作从而保护关键数据的一致性 这些特点使得Java成为面向对象语言中对于多线程特性支持方面的佼佼者(C++正在试图把boost库中的对于线程的支持部分纳入语言标准)
Java中内置了对于对象并发访问的支持 每一个对象都有一个监视器(monitor) 同时只允许一个线程持有监视器从而进行对对象的访问 那些没有获得监视器的线程必须等待直到持有监视器的线程释放监视器 对象通过synchronized关键字来声明线程必须获得监视器才能进行对自己的访问
synchronized声明仅仅对于一些较为简单的线程间同步问题比较有效 对于哪些复杂的同步问题 比如带有条件的同步问题 Java提供了另外的解决方法 wait/notify/notifyAll

获得对象监视器的线程可以通过调用该对象的wait方法主动释放监视器 等待在该对象的线程等待队列上 此时其他线程可以得到监视器从而访问该对象 之后可以通过调用notify/notifyAll方法来唤醒先前因调用wait方法而等待的线程
一般情况下 对于wait/notify/notifyAll方法的调用都是根据一定的条件来进行的 比如 经典的生产者/消费者问题中对于队列空 满的判断 熟悉POSIX的读者会发现 使用wait/notify/notifyAll可以很容易的实现POSIX中的一个线程间的高级同步技术 条件变量
简单例子
本文将围绕一个简单的例子展开论述 这样可以更容易突出我们解决问题的思路 方法 本文想向读者展现的正是这些思路 方法 这些思路 方法更加适用于解决大规模 复杂应用中的并发问题 考虑一个简单的例子 我们有一个服务提供者 它通过一个接口对外提供服务 服务内容非常简单 就是在标准输出上打印Hello World 类结构图如下