`
endual
  • 浏览: 3558255 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java并行开发

    博客分类:
  • java
 
阅读更多

 1, 保证线程安全的三种方法: a, 不要跨线程访问共享变量b, 使共享变量是final类型的c, 将共享变量的操作加上同步

  2, 一开始就将类设计成线程安全的, 比在后期重新修复它,更容易.

  3, 编写多线程程序, 首先保证它是正确的, 其次再考虑性能.

  4, 无状态或只读对象永远是线程安全的.

  5, 不要将一个共享变量裸露在多线程环境下(无同步或不可变性保护)

  6, 多线程环境下的延迟加载需要同步的保护, 因为延迟加载会造成对象重复实例化

  7, 对于volatile声明的数值类型变量进行运算, 往往是不安全的(volatile只能保证可见性,不能保证原子性).详见volatile原理与技巧中, 脏数据问题讨论.

  8, 当一个线程请求获得它自己占有的锁时(同一把锁的嵌套使用), 我们称该锁为可重入锁.在jdk1.5并发包中, 提供了可重入锁的java实现-ReentrantLock.

  9, 每个共享变量,都应该由一个唯一确定的锁保护.创建与变量相同数目的ReentrantLock, 使他们负责每个变量的线程安全.

  10,虽然缩小同步块的范围, 可以提升系统性能.但在保证原子性的情况下, 不可将原子操作分解成多个synchronized块.

  11, 在没有同步的情况下, 编译器与处理器运行时的指令执行顺序可能完全出乎意料.原因是, 编译器或处理器为了优化自身执行效率, 而对指令进行了的重排序(reordering).

  12, 当一个线程在没有同步的情况下读取变量, 它可能会得到一个过期值, 但是至少它可以看到那个线程在当时设定的一个真实数值. 而不是凭空而来的值. 这种安全保证, 称之为最低限的安全性(out-of-thin-air safety)

  在开发并发应用程序时, 有时为了大幅度提高系统的吞吐量与性能, 会采用这种无保障的做法.但是针对, 数值的运算, 仍旧是被否决的.

  13, volatile变量,只能保证可见性, 无法保证原子性.

  14, 某些耗时较长的网络操作或IO, 确保执行时, 不要占有锁.

  15, 发布(publish)对象, 指的是使它能够被当前范围之外的代码所使用.(引用传递)对象逸出(escape), 指的是一个对象在尚未准备好时将它发布.

  原则: 为防止逸出, 对象必须要被完全构造完后, 才可以被发布(最好的解决方式是采用同步)

  this关键字引用对象逸出

  例子: 在构造函数中, 开启线程, 并将自身对象this传入线程, 造成引用传递.而此时, 构造函数尚未执行完, 就会发生对象逸出了.

  16, 必要时, 使用ThreadLocal变量确保线程封闭性(封闭线程往往是比较安全的, 但一定程度上会造成性能损耗)封闭对象的例子在实际使用过程中, 比较常见, 例如 hibernate openSessionInView机制, jdbc的connection机制.

  17, 单一不可变对象往往是线程安全的(复杂不可变对象需要保证其内部成员变量也是不可变的)良好的多线程编程习惯是: 将所有的域都声明为final, 除非它们是可变的

 

 

18, 保证共享变量的发布是安全的a, 通过静态初始化器初始化对象(jls 12.4.2叙述, jvm会保证静态初始化变量是同步的) b, 将对象申明为volatile或使用AtomicReference c, 保证对象是不可变的d, 将引用或可变操作都由锁来保护

  19, 设计线程安全的类, 应该包括的基本要素: a, 确定哪些是可变共享变量b, 确定哪些是不可变的变量c, 指定一个管理并发访问对象状态的策略

  20, 将数据封装在对象内部, 并保证对数据的访问是原子的.建议采用volatile javabean模型或者构造同步的getter,setter.

  21, 线程限制性使构造线程安全的类变得更容易, 因为类的状态被限制后, 分析它的线程安全性时, 就不必检查完整的程序.

  22, 编写并发程序, 需要更全的注释, 更完整的文档说明.

  23, 在需要细分锁的分配时, 使用java监视器模式好于使用自身对象的监视器锁.前者的灵活性更好.

  Object target = new Object();

  // 这里使用外部对象来作为监视器, 而非this

  synchronized(target) {

  // TODO

  }

  针对java monitor pattern, 实际上ReentrantLock的实现更易于并发编程.功能上, 也更强大.

  24, 设计并发程序时, 在保证伸缩性与性能折中的前提下, 优先考虑将共享变量委托给线程安全的类.由它来控制全局的并发访问.

  25, 使用普通同步容器(Vector, Hashtable)的迭代器, 需要外部锁来保证其原子性.原因是, 普通同步容器产生的迭代器是非线程安全的.

  26, 在并发编程中, 需要容器支持的时候, 优先考虑使用jdk并发容器(ConcurrentHashMap, ConcurrentLinkedQueue, CopyOnWriteArrayList...).

  27, ConcurrentHashMap, CopyOnWriteArrayList并发容器的迭代器,以及全范围的size(), isEmpty() 都表现出弱一致性.他们只能标示容器当时的一个数据状态. 无法完整响应容器之后的变化和修改.

  28, 使用有界队列, 在队列充满或为空时, 阻塞所有的读与写操作. (实现生产-消费的良好方案) BlockQueue下的实现有LinkedBlockingQueue与ArrayBlockingQueue, 前者为链表, 可变操作频繁优先考虑,后者为数组, 读取操作频繁优先考虑. PriorityBlockingQueue是一个按优先级顺序排列的阻塞队列, 它可以对所有置入的元素进行排序(实现Comparator接口)

  29, 当一个方法, 能抛出InterruptedException, 则意味着, 这个方法是一个可阻塞的方法, 如果它被中断, 将提前结束阻塞状态.当你调用一个阻塞方法, 也就意味着, 本身也称为了一个阻塞方法, 因为你必须等待阻塞方法返回.

  如果阻塞方法抛出了中断异常, 我们需要做的是, 将其往上层抛, 除非当前已经是需要捕获异常的层次.如果当前方法, 不能抛出InterruptedException, 可以使用Thread.currentThread.interrupt()方法, 手动进行中断.

源:考试大- Java认证考试

分享到:
评论

相关推荐

    java 并行爬取网页

    【标题】:“Java 并行爬取网页” 在Java编程中,实现并行爬取网页是一种...通过以上技术,Java并行爬虫可以高效地处理大规模的网页抓取任务,特别是在处理大量单词翻译时,其并行处理能力能显著提升程序的运行效率。

    java8并行计算示例--可动态配置

    Java 8 是一个重要的 Java 发行版本,引入了许多新特性,其中之一就是并行处理能力的增强,这...在实际开发中,合理使用并行流可以优化代码,提高软件的响应速度,尤其在大数据处理和高性能计算领域有着广泛的应用。

    JAVA项目开发案例全程实录(超级高清).PDF

    根据提供的文件信息,“JAVA项目开发案例全程实录(超级高清).PDF”这一资源看起来是一份详尽的Java项目开发教程或案例分析资料。接下来,我们将基于这些信息深入探讨几个关键的知识点,帮助读者更好地理解Java项目...

    基于JAVA的并行程序编辑器研究与设计

    国家863计划项目“网格服务环境结点建设及其支撑技术研究”的子课题 “用户开发环境研究”,旨在开发出以客户端/服务器模式运行的,能在远程编辑、编译、运行、调试并行程序的集成开发环境。并行程序的源代码编辑...

    并行计算框架的Java实现--系列二

    并行计算框架的Java实现是现代软件开发中的一个重要领域,特别是在大数据处理、机器学习和高性能计算等场景下。本系列的第二部分将深入探讨如何利用Java语言构建并行计算框架,以提高程序的运行效率。在本文中,我们...

    基于JAVA平台的多线程与并行的资料

    **二、Java并行计算** 1. **并行计算概念**:并行计算是指同时使用多个处理器或计算机来解决一个问题,提高计算效率和吞吐量。 2. **Java并发API**:Java从1.5版本引入了`java.util.concurrent`包,提供了一系列...

    Java开发工具包

    Java开发工具包(Java Development Kit,简称JDK)是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。JDK1.8.0_66是Oracle公司发布的一个特定版本,它包含了Java运行时环境...

    java开发文档(jdk1.8中文版java8.zip

    Java开发文档(JDK1.8中文版)是Java开发者的重要参考资料,它包含了Java语言规范、API文档、技术指南等丰富的信息。这份文档是Java 8版本的,Java 8是Oracle公司于2014年发布的一个重大更新,引入了许多新特性,极大...

    Java串行程序并行化执行

    在实际开发中,除了CGLIB,还可以考虑使用Spring的AOP、Java的CompletableFuture等工具来实现异步并行化。结合合适的并发控制策略和负载均衡技术,可以更好地优化应用程序,使其在多核环境中发挥最大效能。

    Java8开发指南

    《Java8开发指南》是针对Java 8这一重要版本的一份详尽的技术手册,它涵盖了Java 8的主要特性和更新,旨在帮助开发者更好地理解和利用这一版本的潜能。在这个指南中,我们将深入探讨以下几个核心知识点: 1. **...

    TestNG系列教程并行执行测试Java开发Java经验技

    总结来说,TestNG的并行执行测试功能是Java开发中的重要工具,它能提升测试效率,加速软件开发的迭代流程,确保产品质量。学习和掌握这些技巧,对于提升Java开发者的专业水平和工作效率大有裨益。

    Java共享内存并行编程

    JOMP是一个专为Java设计的共享内存并行编程接口,其目标是为了简化并行编程的复杂性,提高并行程序的开发效率。它借鉴了OpenMP的思想,提供了一系列伪指令和运行库函数,使得程序员可以更轻松地编写并行代码。JOMP由...

    java线程与并行(主要讲解java的nio包某些内容)

    ### Java线程与并行详解 #### 一、Java线程基础 在Java中,**线程**是一种轻量级的进程,它允许一个程序同时执行多个任务,从而提高程序的执行效率。Java从1.0版本开始就支持多线程编程,并在后续版本中不断完善。...

    Java企业开发指南

    ### Java企业开发指南 #### 知识点概览 1. **Java EE 5简介** 2. **Sun Java System Application Server Platform Edition 9** 3. **J2EE平台概述** 4. **Java EE核心技术** 5. **应用部署与管理** 6. **安全性和...

    MapInfo MapXtreme Java 版开发人员指南

    通过智能多线程机制,MapInfo MapXtreme Java版可以并行处理任务,提升响应速度,尤其在处理大量数据时效果显著。 1.6 基于组件的灵活性 组件化设计允许开发者根据需求选择使用特定的功能模块,方便定制化开发。 ...

    Java 并行数据处理与性能方法详解.pdf

    这里我们将深入探讨Java 7引入的Stream API及其在并行计算中的应用,以及如何利用Spliterator和ForkJoinPool来实现更高效的并行数据处理。 首先,Stream API是Java 7引入的一个新特性,它提供了一种声明性处理数据...

    java手机游戏开发教程

    Java手机游戏开发是一个涵盖多个领域的综合技术,包括编程语言、图形设计、音频处理、网络通信以及游戏引擎等。本教程将深入探讨如何使用Java进行手机游戏的开发。 首先,Java作为一门面向对象的编程语言,因其跨...

    java开发+精通 经典总结 全是免分资源

    Java开发是IT行业中一个至关重要的领域,它以其跨平台、面向对象的特点,广泛应用于企业级应用、移动开发、大数据处理等多个场景。这份“java开发+精通 经典总结”资源集合,显然是为了帮助开发者深入理解和掌握Java...

    Java 开发源代码

    Java开发源代码是Java程序员日常工作中不可或缺的一部分,它揭示了Java平台的核心机制和类库的内部运作。在Java 8中,特别是版本1.8.0_144,引入了许多重要的更新和改进,这对于理解Java语言的演进以及如何优化代码...

    java开发实战1200例第一卷

    此外,线程和并发处理也是Java开发中的重要课题,书中的实例会教授如何管理和控制线程,实现多任务并行执行。 数据库操作是多数Java应用的核心,可能包含JDBC(Java Database Connectivity)的使用,如连接数据库、...

Global site tag (gtag.js) - Google Analytics