《Java白皮书1996自译》07:多线程

詹姆斯·高斯林

第七章 多线程

不幸的是,与传统的单线程C和c++风格相比,编写同时处理许多事情的程序要困难得多。您可以用诸如C和c++之类的语言编写多线程应用程序,但是难度会以数量级增加,即使这样也不能保证供应商的库是线程安全的。

术语“线程安全”是指一个给定的库函数以这样一种方式实现,即它可以由多个并发的执行线程执行。

显式编程线程支持的主要问题是,您永远无法确定是否已经获得了所需的锁,并在正确的时间再次释放它们。例如,如果您过早地从一个方法返回,或者如果引发了一个异常,对于另一个实例,您的锁没有被释放;通常的结果是死锁。

7.1、Java语言级别的线程

对线程的内置支持为Java程序员提供了一个强大的工具来改进图形化应用程序的交互性能。如果您的应用程序需要在滚动页面和从服务器下载文本文件的同时运行动画和播放音乐,那么多线程是在单个进程空间中获得快速、轻量级并发性的方法。线程有时也称为轻量级进程或执行上下文。

线程是Java的基本基石。Java库提供了一个Thread类,它支持启动线程、运行线程、停止线程和检查线程状态的丰富方法集合。

Java线程支持包括一组复杂的同步原语,它们基于20年前由C.A.R. Hoare引入的广泛使用的监视和条件变量范式,并在Xerox PARC的Cedar/Mesa系统的生产环境中实现。将对线程的支持集成到语言中可以使它们更容易使用和更健壮。Java的大部分线程集成风格都是模仿Cedar和Mesa的。

Java的线程是抢占式的,根据Java解释器执行的平台不同,线程也可以被分段。在不支持时间分割的系统上,一旦一个线程启动,它放弃对处理器控制的唯一方法就是让另一个具有更高优先级的线程来控制处理器。如果您的应用程序可能是计算密集型的,那么您可以考虑如何通过使用yield()方法周期性地放弃控制,让其他线程有机会运行;这样做将确保图形应用程序有更好的交互响应。

7.2、集成的线程同步

Java在语言(语法)级别上支持多线程,并通过其运行时系统和线程对象提供支持。在语言级别,声明为synchronized的类中的方法不会并发运行。这些方法在监视器的控制下运行,以确保变量保持一致的状态。每个类和实例化的对象都有自己的监视器,在需要时可以使用。

下面是HotJava web浏览器中排序演示的几个代码片段。主要的兴趣点是两个方法stop和startSort,它们共享一个公共变量kicker(它启动排序线程):

/*
作者:AT阿宝哥
日期:2016年9月18日
愿景:参考官方资料,做最好的课程,成就更多职业人!
邮箱:[email protected]
CSDN:https://blog.csdn.net/goldentec
简书:https://www.jianshu.com/u/8a6075d7a2e0
说明:

注意:
    
*/
public synchronized void stop() {

		if (kicker != null) {

			kicker.stop();

			kicker = null;

		}

}

private synchronized void startSort() {

		if (kicker == null || !kicker.isAlive()) {

			kicker = new Thread(this);

			kicker.start();

		}

}

stop和startSort方法被声明为同步的——它们不能并发运行,这使它们能够在共享kicker变量中保持一致的状态。当一个同步的方法被输入时,它需要一个当前对象上的监视器。监视器阻止该对象中的任何其他同步方法运行。当同步方法以任何方式返回时,它的监视器将被释放。同一对象中的其他同步方法现在可以自由运行。

如果您正在编写Java应用程序,那么您应该注意实现类和方法,使它们是线程安全的,就像Java运行时库是线程安全的一样。如果您希望您的对象是线程安全的,那么任何可能更改实例变量值的方法都应该声明为synchronized。这确保在任何时候只有一个方法可以更改对象的状态。Java监视器是可重入的:一个方法可以多次获得相同的监视器,并且一切都可以正常工作。

7.3、多线程支持——结论

虽然其他系统提供了多线程的工具(通常通过“轻量级进程”库),但是像Java那样在语言中构建多线程支持为程序员提供了一个更强大的工具,可以轻松创建线程安全的多线程类。

多线程的其他好处是更好的交互响应和实时行为。独立Java运行时环境表现出良好的实时行为。运行在流行操作系统之上的Java环境提供了底层平台提供的实时响应能力。


好好学习,天天向上!继续下一章…


发布了36 篇原创文章 · 获赞 30 · 访问量 5928

猜你喜欢

转载自blog.csdn.net/goldentec/article/details/104780121