武汉java培训
达内武汉中心

15827352908

热门课程

武汉Java培训:适用于Java程序员的CSP

  • 时间:2017-09-04 17:40
  • 发布:武汉Java培训
  • 来源:企业面试题

今天带给大家的干货知识是c++的命名空间的使用

在 Java 平台上进行多线程编程是件让人望而生畏的事,这一点得到了广泛认可。实际上,一般的理论似乎是:最好把多线程编程留给 Java 高手。Sun Microsystems 通过把以下内容描述成 EJB 架构的目标之一,也间接地、更深入地讨论了这个观点:

应用程序开发人员不必理解低级事务和状态管理细节、不必理解多线程、连接池或者其他复杂的低级 API。
如果以这个观念为起点,那么您也就不会惊讶为什么许多 Java 开发人员要避开设计和开发多线程应用程序。但事实上,许多(即使不是大多数)企业级问题使用某种形式的多线程来解决最合适,而 EJB 和类似的框架并不像它们声称的那样,总是最容易的解决方案。

在这篇由三部分组成的系列文章中,我介绍了一个理论,该理论承认了并发编程的复杂性,并且没有试图隐藏这种复杂性,或者使它不那么难于学习和应用。通信顺序进程(Communicating Sequential Processes —— CSP) 是一个精确的并发数学理论,可以用来构建多线程应用程序,确保构建的程序中不出现并发的常见问题,而且更重要的是,这一点能够得到证实。

在介绍 CSP 理论和它基于 Java 语言的实现 —— JCSP 库 —— 之前,我希望能够确定我们有一个共同的讨论框架。我先从 Java 平台的并发编程技术概述开始,接着提供了多线程应用程序开发缺陷的深入概述,这些缺陷包括:竞争冒险、死锁、活动锁和资源耗尽等。最后,通过一些具体的讨论结束本文,这些讨论包括为什么 不能像您喜欢的那样验证多线程 Java 应用程序,并确定现有变通方法中您最偏爱的变通方法。
有了这些基础,就可以完全地体会 JCSP 的好处了。这是 Java 平台多线程编程的一个概念性和实践性的解决方案,我将在第 2 部分对其进行探讨,还将在 第 3 部分 探讨 Java 平台上更高级的 CSP 应用程序。
本文假设读者对于 Java 语言的并发编程有一般性的了解,虽然我在文章中也提供了关于这一主题的一个概述。Java 语言的并发编程

就其自身来说,并发编程是一种技术,提供了操作的同时执行,不论是在单一系统上还是分布在大量系统上。这类操作实际是一些指令顺序,例如单独某个顶级任务的子任务,这类操作能够并行执行,或者是作为线程,或者是作为进程。线程和进程之间的本质区别在于:进程通常是独立的(例如独立的地址空间),所以只能通过系统提供的进程间通信机制进行交互,而线程通常共享单一进程的状态信息,能够直接共享系统资源和内存中的对象。

可以使用下面两种方法之一,通过多个进程来实现并发。第一种方法是在同一个处理器上运行进程,由操作系统处理进程之间的上下文环境切换。(可以理解,这种切换要比同一进程内多线程之间的上下文环境切换更慢。)第二种方法是构建大规模的并行和复杂的分布式系统,在不同的物理处理器上运行多个进程。

从内建支持的角度来说,Java 语言通过线程提供并发编程;每个 JVM 都能支持许多线程同时执行。可以用以下两种方法之一在 Java 语言中创建线程:

继承 java.lang.Thread 类。在这种情况下,已经重写的子类的 run() 方法必须包含实现线程运行时行为的代码。要执行这个代码,需要实例化子类对象,然后调用对象的 start() 方法,这样就可以在内部执行 run() 方法了。

创建 Runnable 接口的定制实现。这个接口只包含一个 run() 方法,在这个方法中,要放置应用程序代码。要执行这个代码,需要实例化实现类的对象,然后在创建新 Thread 时,把对象作为构造函数的参数传入。然后调用新创建的线程对象的 start() 方法,开始执行控制的新线程。

线程安全性和同步

如果 Java 对象中的某个方法能够安全地运行在多线程环境中,那么就称该方法是 线程安全的。要获得这种安全性,必须有一种机制,通过该机制,运行同一方法的多个线程就能够同步其操作,这样,在访问相同的对象或代码行时,就会只允许一个线程被处理。这种同步要求线程使用叫作 信号 的对象彼此进行沟通。

有一种类型的信号叫作 互斥信号 或 互斥体。顾名思义,这个信号对象的拥有权是互斥的,也就是说,在任意指定时间,只有一个线程能够拥有互斥体。其他想获得所有权的线程会被阻塞,它们必须等待,直到拥有互斥体的线程释放互斥体。如果多个线程按顺序排队等候同一互斥体,那么在当前拥有者释放它的时候,只有一个等候线程能够得到它;其他线程将继续阻塞。

在 1970 年代初,C.A.R. Hoare 和其他人共同开发了一个叫作 监视器 的概念(请参阅 参考资料)。 一个 监视器 就是一个代码主体,它的访问受到互斥体的保护。任何想执行这个代码的线程,都必须在代码块顶部得到关联的互斥体,然后在底部再释放它。因为在指定时间只有一个线程能够拥有互斥体,所以这就有效地保证了只有拥有它的线程才能执行监视器的代码块。(受保护的代码不需要相邻 —— 例如,Java 语言中的每个对象都有一个与之关联的监视器。)

任何想在 Java 语言中进行线程编程的开发人员,都会立即把上面的内容当成 synchronized 关键字所带来的效果。可以确保包含在 synchronized 块中的 Java 代码在指定时间只被一个线程执行。在内部,可以由运行时将 synchronized 关键字转换成某一种情况:所有的竞争线程都试图获得与它们(指线程)正在操作的对象实例关联的那个(惟一的一个)互斥体。成功得到互斥体的线程将运行代码,然后在退出 synchronized 块时释放互斥体。
等候和通知

wait/notify 构造在 Java 语言的线程间通信机制中也扮演了重要的角色。基本的想法是:一个线程需要的某个条件可以由另外一个线程促成。这样,条件的 wait 就可以得到满足。一旦条件为真,那么引发条件的线程就会 notify 等候线程苏醒,并从中止的地方继续进行。

wait/notify 机制要比 synchronized 机制更难理解和判断。要想判断出使用 wait/notify 的方法的行为逻辑,就要求判断出使用它的所有方法的逻辑。一次判断一个方法,把该方法和其他方法隔离开,是对整体系统行为得出错误结论的可靠方式。显然,这样做的复杂性会随着要判断的方法的数量增长而迅速提高。

好了,关于适用于Java程序员的CSP今天就讲到这里,更多关于Java的相关教程请关注达内武汉Java培训官方网站。

上一篇:华为JAVA面试题
下一篇:武汉Java培训:如何快速成为Java高手
选择城市和中心
贵州省

广西省

海南省

有位老师想和您聊一聊