`

Java并发编程总结---Hadoop核心源码实例解读

 
阅读更多

程序设计需要同步(synchronization),原因:
1)复杂的功能要求的需要使用多线程编程,线程之间存在读写共享变量。
2)读写共享变量(shared mutual variable),JVM的内存模型(Memory model: decide when and how changes made by one thread become visuble to others)受到其它因素干扰。
3)对共享变量的操作非原子性。例如 i++;就不是原子操作,它分为两部分,(1) 读i (2) i+1写入内存。如果i是线程A和线程B共享的变量,线程A在操作(1)之后,线程调度器调度调度线程B执行i++,因此两个线程在变量i产生了不一致。注意,volatile修饰符是线程操作之前更新数据,但是,上面的问题显然不是更新数据就能解决的。
4)增加互斥区(mutual exclusion)会降低执行效率,但是这是实现数据安全、功能强大的多线程编程最为重要的部分。
5)线程之间需要配合的场景需要并发控制逻辑。

Java并发编程使用的方法:


1) 为代码块和函数添加synchronized,同步的作用有两点:

(1)a means of mutual exclusion, to prevent an object from being observed in an inconsistent state while it’s being modified by another thread.

(2)guarantee that one thread’s changes will be visible to another
2)配合使用object的wait和notify,实现对象monitor控制权从一个线程调度到另外一个线程。具体实例请参阅http://blog.sina.com.cn/s/blog_4a1f59bf0100rgxh.html
3)使用ReentrantLock和Condition控制。ReentrantLock和Condition出现在java.util.concurrent包中。下面有从Hadoop源码中摘取出来的一部分的内容作为介绍。

Hadoop源码使用并发控制的实例:
Map阶段产生<K,V>会先存储在内存中,等到io.sort.mb指定的内存达到阈值(percent)时,会启动spill到本地磁盘的工作。
ReentrantLock与Condition的配合使用,Condition为ReentrantLock锁的等待和释放提供控制逻辑。
例如,使用ReentrantLock加锁之后,可以通过它自身的Condition.await()方法释放该锁,线程在此等待Condition.signal()方法,然后继续执行下去。await方法需要放在while循环中,因此,在不同线程之间实现并发控制,还需要一个volatile的变量,boolean是原子性的变量。因此,一般的并发控制的操作逻辑如下所示:
volatile boolean isProcess = false;
ReentrantLock lock  = new ReentrantLock();
Condtion processReady = lock.newCondtion();
thread: run() {
    lock.lock();
    isProcess = true;
   try {
    while(!isProcessReady) {  //isProcessReady 是另外一个线程的控制变量
      processReady.await();//释放了lock,在此等待signal
     }catch (InterruptedException e) {
          Thread.currentThread().interrupt();
        } finally {
          lock.unlock();
          isProcess = false;
        }
      }
    }
}
看Hadoop的一段摘取的源码:

private class MapOutputBuffer<K extends Object, V extends Object>
      implements MapOutputCollector<K, V>, IndexedSortable {
...
    boolean spillInProgress; 
    final ReentrantLock spillLock = new ReentrantLock();
    final Condition spillDone = spillLock.newCondition();
    final Condition spillReady = spillLock.newCondition();
    volatile boolean spillThreadRunning = false;
    final SpillThread spillThread = new SpillThread();
...
    public MapOutputBuffer(TaskUmbilicalProtocol umbilical, JobConf job,
                           TaskReporter reporter
                           ) throws IOException, ClassNotFoundException {
    ...
      spillInProgress = false;
      spillThread.setDaemon(true);
      spillThread.setName("SpillThread");
      spillLock.lock();
      try {
        spillThread.start();
        while (!spillThreadRunning) {
          spillDone.await();
        }
      } catch (InterruptedException e) {
        throw new IOException("Spill thread failed to initialize", e);
      } finally {
        spillLock.unlock();
      }
    }

    protected class SpillThread extends Thread {

      @Override
      public void run() {
        spillLock.lock();
        spillThreadRunning = true;
        try {
          while (true) {
            spillDone.signal();
            while (!spillInProgress) {
              spillReady.await();
            }
            try {
              spillLock.unlock();
              sortAndSpill();
            } catch (Throwable t) {
              sortSpillException = t;
            } finally {
              spillLock.lock();
              if (bufend < bufstart) {
                bufvoid = kvbuffer.length;
              }
              kvstart = kvend;
              bufstart = bufend;
              spillInProgress = false;
            }
          }
        } catch (InterruptedException e) {
          Thread.currentThread().interrupt();
        } finally {
          spillLock.unlock();
          spillThreadRunning = false;
        }
      }
    }

分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目.zip

    这些实例可以帮助初学者快速掌握Java编程的基本规则,理解面向对象编程的核心概念。 中级实例则会深入到更复杂的主题,如多线程、集合框架、IO流、网络编程等。通过这些实例,开发者可以学习如何在实际项目中管理...

    Hadoop MapReduce Cookbook 源码

    《Hadoop MapReduce Cookbook 源码》是一本专注于实战的书籍,旨在帮助读者通过具体的例子深入理解并掌握Hadoop MapReduce技术。MapReduce是大数据处理领域中的核心组件,尤其在处理大规模分布式数据集时,它的重要...

    java网络编程与分布式计算

    13. **Hadoop与MapReduce**:Hadoop是一个开源分布式计算框架,MapReduce是其核心计算模型,用于处理海量数据。 14. **Distributed Cache**:如Hazelcast或Ignite,提供分布式缓存功能,提高大规模应用的性能。 15...

    webhdfs-java-client-master

    "webhdfs-java-client-master"这个项目很可能是该客户端库的一个源码仓库主分支,包含了完整的源代码、测试用例和其他相关资源,便于开发者理解和自定义其功能。 WebHDFS是HDFS的一个RESTful接口,它允许通过HTTP...

    java基础知识之hadoop源码阅读必备(一).docx

    在深入Hadoop源码之前,理解Java基础知识至关重要,特别是对于多线程编程和内部类的使用,这些都是Hadoop框架中的核心元素。以下是对这两个关键知识点的详细解释。 **一、多线程编程** Java的多线程编程允许程序...

    couchbase-hadoop-plugin-src

    总结,Couchbase-Hadoop-Plugin-src提供了Hadoop和Couchbase之间的无缝连接,通过源码分析和实际操作,我们可以更好地理解和利用这个插件,提升大数据处理的效率和灵活性。对于需要处理大规模实时数据的项目,这个...

    对java总的总结ppt

    这篇Java总结PPT主要涵盖了Java这门广泛使用的编程语言的核心概念、关键特性以及实际应用。通过深入理解和学习,读者可以系统地掌握Java编程的基础与进阶知识。 **一、Java语言基础** 1. **Java简介**:Java是一种...

    java操作Hive源码之HiveJDBC实例(mysql数据库)

    在Java编程环境中,与Hive进行交互通常涉及使用Hive JDBC驱动程序,这是一种允许Java应用程序通过JDBC(Java Database Connectivity)接口与Hadoop上的Hive数据仓库进行通信的方式。本实例将聚焦于如何使用Java和...

    基于SpringBoot+Hadoop+Vue开发的企业级网盘分布式系统+本科毕业设计+源码+数据库.zip

    本项目利用SpringBoot作为服务端基础,Java作为编程语言,Hadoop提供大规模数据存储,Vue.js构建用户界面,构建了一个高效、灵活的企业级网盘分布式系统。无论是作为毕业设计还是课程实践,这个项目都提供了全面的...

    Java学习之IO总结及mina和netty

    - 应用实例:如Hadoop的RPC框架、Twitter、Netflix等大型项目。 文件名"ServerNonblocking.java"和"ClientNonblocking.java"暗示了可能包含非阻塞I/O的服务器和客户端实现。在NIO中,非阻塞模式允许服务器处理多个...

    java b2c商城源码

    【标题】"Java B2C商城源码"指的是基于Java编程语言开发的电子商务平台源代码,主要用于构建B2C(Business-to-Consumer)类型的在线购物网站。B2C模式是商家直接面向消费者销售产品和服务的商业模式,常见于各大电商...

    hadoop实战中文版

    《Hadoop实战中文版》与《云计算框架Hadoop之源码分析》是两份深入了解Hadoop生态系统的宝贵资料。Hadoop作为开源大数据处理框架,因其分布式计算能力在业界备受推崇,广泛应用于数据仓库、数据分析以及大规模数据...

    Hadoop RPC机制分析

    在Hadoop中,远程过程调用(RPC)是核心组件之一,它使得节点间的通信变得高效且可靠。本文将深入探讨Hadoop的RPC机制,解析其工作原理,并结合源码分析其内部实现。 一、RPC简介 RPC是一种让程序能够调用运行在...

    学通Java的24堂课

    在“学通Java的24堂课”这个学习资源中,你将踏上一条全面而深入的Java编程之旅。这门课程由清华大学出版社出版,旨在帮助初学者和有经验的开发者进一步提升Java技能。课程涵盖了从基础到高级的多个主题,通过丰富的...

    Storm 源码分析

    Storm的设计目标是成为实时计算领域的Hadoop,支持多种编程语言,并且能够很好地与现有的Hadoop生态系统集成。 Storm的主要应用场景包括: - 实时数据分析:如实时统计网站访问量、用户行为分析等。 - 在线机器学习...

    java源码:cloudxy(弹性云计算平台 Cloudxy).rar

    本篇将深入探讨Cloudxy的Java源码,解析其核心设计理念与实现机制,帮助读者了解云计算平台的内部工作原理。 首先,Cloudxy是一个基于Java开发的弹性云计算平台,它利用Java的强大功能和跨平台特性,实现了云资源的...

    129个Java项目源码下载 [共分20个压缩卷]10

    这些项目源码涵盖了各种应用场景,对于Java学习者来说是一份宝贵的资料,可以用来深入理解Java编程实践、提高编程技能以及学习如何解决实际问题。 首先,让我们谈谈Java项目的多样性。这129个项目可能包括但不限于...

    私塾在线学习网 hadoop教程

    在Hadoop教程中,源码部分可能涵盖了Hadoop的安装配置、HDFS的使用、MapReduce编程模型等关键知识点。例如,安装配置可能涉及环境变量设置、Hadoop集群搭建、伪分布式或完全分布式模式的启动等步骤。MapReduce编程...

    java学习资料(全方位)

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而闻名。这份“java学习资料(全方位)”的压缩包很显然是为了帮助初学者或有经验的开发者全面掌握Java技术栈。以下是一些关键的学习点,...

    java毕业设计之社区医院挂号系统(源码+LW).zip

    总的来说,这个Java毕业设计项目涵盖了软件工程中的多个重要方面,包括需求分析、系统设计、数据库管理、前端交互、后台逻辑、并发处理和数据可视化等,是学习和实践Java Web开发的一个综合实例。对于学生来说,这样...

Global site tag (gtag.js) - Google Analytics