完美的简单多线程模型
Java的设计者所提供的编程特性,包括对多线程多任务的语言级支持。多任务具有两种类型:基于进程的多任务和基于线程的多任务。在基于进程的多任务中,最小的可调度单元是进程。进程实际上就是正在执行的一个程序。因此,基于进程的多任务就是允许计算机同时运行两个或多个程序的特性。在基于线程的多任务中,最小的可调度单元是线程。线程定义了一个程序内的某条执行路径。因此,一个进程可以包含有两个或更多的执行线程,而多线程程序可以有两个或更多个可以并发执行的部分。
尽管基于进程的多任务通常是操作系统提供的功能,基于线程的多任务却可以极大地受益于程序设计语言级别的支持。例如,C++没有对多线程编程提供内置支持,于是就必须依赖于操作系统来处理多线程任务。这就意味着创建、启动、同步和结束线程都必须通过对操作系统的多次调用来实现。因此C++中的多线程代码是不可移植的。这也使得C++编程中的多线程没有得以广泛应用。
由于Java内置了对多线程的支持,哪些在其他语言中必须由手工完成的工作,现在都可以由Java自动处理。Java多线程模型中最有特色的部分之一,就是其实现同步的方式。同步建立在两种创新的特性之上。首先,在Java中,所有的对象都有充当互斥锁的内置侦听器。在给定的时刻,任何侦听器只能由一个线程拥有。通过使用synchronized关键字对方法进行修饰,可以启用锁定特性。在调用同步方法时,该对象就被锁定,而试图访问该对象的其他线程就只能等待。其次,Java对同步的支持也可以从所有类的共同超类Object中体现。Object声明了下面三个同步方法:wait()、notify()和notifyAll()。这些方法支持线程间通信。因此,所有的对象都对线程间通信有内置的支持。通过和同步方法结合使用,这些方法可以为线程的互操作提供高级别的控制。
通过将多线程作为语言的一个易于使用的内置特性,Java改变了人们关于程序基本体系结构的观念。在Java出现之前,大部分程序员将程序看成是,只有一条执行路径的单块结构。在Java出现之后,程序演变为多个可互操作的并发任务的集合。这种并发机制的改变对于计算产生了深远的影响,但是其最重大的影响可能是使得软件组件的使用更为便捷。
|