彩票走势图

五分钟,轻松掌握Java并发编程!

原创|行业资讯|编辑:龚雪|2014-05-22 09:40:35.000|阅读 342 次

概述:介绍了解ava并发编程原理,工作状态,模块模式等,从而快速掌握Java并发编程,并附上各种资源工具。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

Java作为最流行的编程语言之一,随着 Java 8的到来,越来越多的人开始学习,并深入研究!下面将介绍 Java并发编程,让开发者在最短的时间里掌握并发编程。

1. 并发

1.1. 什么是并发?

并 发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力。如果程序中一个耗时的任务能以异步或并行的方式运行,那么整个程序的吞吐量和可 交互性将大大改善。现代的PC都有多个CPU或一个CPU中有多个核。是否能合理运用多核的能力将成为一个大规模应用程序的关键。

1.2. 进程 vs 线程

进程是以独立于其他进程的方式运行的,进程间是互相隔离的。一个进程无法直接访问另一个进程的数据。进程的资源诸如内存和CPU时间片都是由操作系统来分配。

线程又被称为轻量级进程。每个线程有它独自的调用栈, 但是在同一进程下的线程又能互相访问它们间的共享数据。每个线程都有它独自的缓存。如果一个线程读取了某些共享数据,那么它将这些数据存放在自己的缓存中以供将来再次读取。

一个 Java应用程序默认以一个进程的形式运行着。在一个 Java程序中,你将协同多个不同的线程一起完成并行运算或实现异步行为。

2. 并发的改进与问题

2.1. 并发性能的上限

之所以并发号称能较快的完成某些任务是因为这些任务能被分组成多个子任务,并且这些子任务能被并行的执行。所以一个任务的实际运行效率将受限于该任务中能并行执行的部分。

一个程序理论上可达到的最高并发性能可通过以下一个被称为Amdahl 定律来计算出:

设F为一个程序中不能被并行执行的百分比,N是处理器的数量,那么理论上该程序能获得的最高并发性能将可能是1/ (F+ ((1-F)/n)).

2.2. 并发问题

线程有独自的调用栈,但是又能互相访问共享的数据。所以这里你会遇到两个问题,可见性和访问。

可见性问题发生于如果线程A先读取了某些共享数据,之后线程B对这些数据进行了修改,那么线程A可能看不到线程B对这数据的改动。

访问问题发生于于多个线程同时访问修改同一个共享数据。可见性及访问问题将导致:

活跃性失败——由于并发访问数据导致程序无任何反应。 譬如,死锁。

安全性失败——程序创建了错误的数据。

3. Java中的并发

3.1. 进程与线程

一个 Java程序默认以一个线程运行在自己的进程中。 Java语言通过Thread相关代码来支持线程。 Java程序可通过Thread这个类来创建线程。从 Java1.5起,在 Java.util.concurrent中提供了改进的并发库。

3.2. 锁和线程同步

Java提供了“锁” 机制来保护代码片段免于被多个线程在同一时刻运行。最简单的锁住一个方法或一个类就是在该方法或类前添加synchronized关键字

保证了在Java中synchronized关键字保证了在同一时刻,只有单个线程能访问这块代码,每个进入这同步代码块的线程都将能看到之前持有相同锁进入的线程的所做的改动.对于线程间的可靠通讯及互斥访问 来说,同步是非常必要的

你可以在定义方法时使用synchronized关键字。这个关键字保证了同一时刻只有一个线程能运行这个方法。其他同样调用了这个方法的线程将被阻塞直到第一个线程离开这个方法。

1 public synchronized void critial() {

2     // some thread critical stuff

3     // here

4   }

你同样也能用synchronized关键字来保护方法中的代码块。这块代码将由一个关键对象来保护,该关键对象可以是个string或其他object。这个关键对象就被称为 lock。所有被相同lock保护的代码在同一时刻只能被单个线程执行。

举例来说,以下的数据结构将保证同时只有单个线程可以访问add和next方法:

01   package de.vogella.pagerank.crawler;

02   

03  import  Java.util.ArrayList;

04  import  Java.util.List;

05  /*** Data structure for a web crawler. Keeps track of the visited sites and keeps

06    * a list of sites which needs still to be crawled.

07    * @author Lars Vogel

08    */

09    public class CrawledSites {

10    private List<String> crawledSites = new ArrayList<String>();

11    private List<String> linkedSites = new ArrayList<String>();

12   

13    public void add(String site) {

14      synchronized (this) {

15        if (!crawledSites.contains(site)) {

16          linkedSites.add(site);

17        }

18      }

19    }

20  /** * Get next site to crawl. Can return null (if nothing to crawl) */

21    public String next() {

22      if (linkedSites.size() == 0) {

23        return null;

24      }

25      synchronized (this) {

26        <em>// Need to check again if size has changed</em>

27        if (linkedSites.size() > 0) {

28          String s = linkedSites.get(0);

29          linkedSites.remove(0);

30          crawledSites.add(s);

31          return s;

32        }

33        return null;

34      }

35    }

36   

37  }

3.3. Volatile

如果一个变量声明时使用了volatile&nbsp;关键字,那么该关键字保证了,任何读取该变量的线程都将读到最新写进该变量的值。但volatile 关键字不会保证变量上的任何互斥访问。

因为在 Java 5中,对一个声明了volatile 的变量进行写操作会导致该写操作所在该线程之前所有的对非volatile 变量的修改进行同步更新。这也可用来更新引用类型变量。例如,有个volatile 类型的变量person。你必须创建一个临时变量person,然后调用SETTER方法来初始化这变量然后将临时变量赋值给final变量。 这会使这个变量的地址发生改变并且此变量的值对于其他线程变为可见。

4. Java 内存模型

4.1. 概览

Java内存模型描述了线程内存与主存间的通讯关系。

Java内存模型定义了线程内的内存改变将怎样传递到其他线程的规则,同样也定义了线程内存与主存进行同步的场景,也描述了哪些操作属于原子操作及操作间的顺序。

4.2. 原子操作

一个原子操作是指一个执行时不会被其他操作影响到的最小单位的操作。

Java语言规范保证了对一个变量的读和写操作都是原子的(除了LONG和DOUBLE类型的变量)。对于LONG或DOUBLE类型的变量,只有当这些变量声明时使用了volatile关键字才是原子的

假设定义了一个INT变量I,那么在 Java中,I++操作不是一个原子操作。同样,这对于其他数字类型的变量也都不是一个原子操作。

I++操作先从I中读取了当前值(这是个原子操作)然后再让它加上1写回(原子操作)。但是在读和写这两个操作间,I的值有可能被改变。

从 Java1.5起, Java提供了原子变量,例如AtomicInteger 或 AtomicLong 都提供了类似 getAndDecrement(), getAndIncrement() 及 getAndSet()等原子方法。

4.3.同步代码块的内存更新

Java内存模型保证了每个进入相同锁同步块的线程都能看到之前进入的其他所有线程修改的结果。

温馨小提示:好的资源,在 Java开发中能事半功倍!

Java并发编程基础://ifeve.com/java-concurrency-cookbook/

业界被公认为最好的Java开发平台:IntelliJ IDEA 

最实惠、综合全面的J2EE IDE与Web开发工具套件:MyEclipse

多平台Java安装文件生成工具:install4j

全面测试Java程序的工具:Parasoft Jtest


标签:Java

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
相关产品
install4j

业界一致肯定的、最佳多平台Java安装文件生成工具

IntelliJ IDEA

IntelliJ在业界被公认为优秀的Java开发平台之一,在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、 创新的GUI设计等方面表现突出,并支持基于Android平台的程序开发。

MyEclipse

功能最全面、性价比最高的企业级Java IDE之一

Parasoft Jtest

用于应用软件开发的集成Java测试工具

扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP