并发编程的Java抽象

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  三、并发单元抽象

  大多数并发应用程序都是围绕执行任务进行管理的,任务是抽象,离散的工作单元,所以编写并发程序,首要工作就是提取和分解并行任务。一旦任务被抽象出来,他们就可以交给并发编程平台去执行,同时在任务抽象还有另一个重要抽象,那就是生命周期,一个任务的开始,结束,返回结果,都是生命周期中重要的阶段。那么编程平台必须提供有效安全的管理任务生命周期的API.

  四、线程模型

  线程模型是Java的本质模型,它无所不在,所以Java开发必须搞清楚底层线程调度细节,不搞清楚当然就会有struts1,struts2的原理搞不清楚的基本灾难(比如在struts2的action中塞入状态,把struts2的action配成单例)。

  用线程来抽象并发编程,是比较低级别的抽象,所以难度就大一些,难度级别会根据我们的任务特点有以下几个类别

  (1)任务非常独立,不共享,这是最理想的情况,编程压力为0.

  (2)共享数据,压力开始增大,必须引入锁,Volatile变量,问题有活跃度和性能危险。

  (3)状态依赖,压力再度增大,这时候我们基本上都是求助jdk 提供的同步工具。

  五、任务执行

  任务是一个抽象体,如果被抽象了出来,下一步就是交给编程平台去执行,在Java中,描述任务的一个基本接口是Runnable,可是这个抽象太有限了,它不能返回值和抛受检查异常,所以Jdk5.0有另外一个高级抽象Callable.

  任务的执行在Jdk中也是一个底级别的Thread,线程有好处,但是大量线程就有大大的坏处,所以如果任务量很多我们并不能就创建大量的线程去服务这些任务,那么Jdk5.0在任务执行上做了抽象,将任务和任务执行隔离在接口背后,这样我们就可以引入比如线程池的技术来优化执行,优化线程的创建。

  任务是有生命周期的,所以Jdk5.0提供了Future这个对象来描述对象的生命周期,通过这个future可以取到任务的结果甚至取消任务。

  六、锁

  当然任务之间共享了数据,那么要保证数据的安全,必须提供一个锁机制来协调状态,锁让数据访问原子,但是引入了串行化,降低了并发度,锁是降低程序伸缩性的原罪,锁是引入上下文切换的主要原罪,锁是引入死锁,活锁,优先级倒置的绝对原罪,但是又不能没有锁,在Java中,锁是一个对象,锁提供原子和内存可见性,Volatile变量提供内存可见性不提供原子,原子变量提供可见性和原子,通过原子变量可以构建无锁算法和无锁数据结构,但是这需要高高手才可以办到。

[1][2]

大多数人想要改造这个世界,但却罕有人想改造自己。

并发编程的Java抽象

相关文章:

你感兴趣的文章:

标签云: