并发译文 ’ 目录归档

线程基础之数据竞争与锁

原文地址    译文地址   译者:Alpha ;  校对: 蘑菇街-小宝

大多数现代多线程编程语言都可以避免顺序一致性与性能之间的冲突,因为它们知道:

  • 顺序一致性的问题是由于某些程序转换引起的,例如我们的例子中交换了无关变量的访问顺序,这不会改变单线程程序的意图,但是会改变多线程程序的意图(例如例子中允许r1和r2都为0)。
  • 只有当代码允许两个线程同时访问相同的共享数据,并且是以某种冲突的方式访问时(例如当一个线程读取数据的同时另一个线程写入该数据),才有可能察觉到这种程序转换。如果程序强制以特定顺序来访问共享变量,那么我们就无法判断对独立变量的访问是否被重排序,就如同在单线程程序中也无法判断。
  • 无限制地同时访问普通共享变量会让程序变得难以处理,一般需要避免这种情况。坚持完全的顺序一致性对我们没有好处。我们将在下文用单独的一节来讨论这个问题。

阅读全文

Oracle官方并发教程之高级并发对象

原文地址译文地址

译者:李任

目前为止,该教程重点讲述了最初作为Java平台一部分的低级别API。这些API对于非常基本的任务来说已经足够,但是对于更高级的任务就需要更高级的API。特别是针对充分利用了当今多处理器和多核系统的大规模并发应用程序。 阅读全文

Java Magic. Part 4: sun.misc.Unsafe

原文地址 译文地址 译者:许巧辉 校对:梁海舰

Java是一门安全的编程语言,防止程序员犯很多愚蠢的错误,它们大部分是基于内存管理的。但是,有一种方式可以有意的执行一些不安全、容易犯错的操作,那就是使用Unsafe类。

本文是sun.misc.Unsafe公共API的简要概述,及其一些有趣的用法。
阅读全文

Oracle官方并发教程之执行器(Executors)

原文链接译文链接,译者:Greenster,校对:郑旭东

在之前所有的例子中,Thread对象表示的线程和Runnable对象表示的线程所执行的任务之间是紧耦合的。这对于小型应用程序来说没问题,但对于大规模并发应用来说,合理的做法是将线程的创建与管理和程序的其他部分分离开。封装这些功能的对象就是执行器,接下来的部分将讲详细描述执行器。
阅读全文

Oracle官方并发教程之同步

原文链接译文链接,译者:蘑菇街-小宝,Greenster李任  校对:丁一,郑旭东,李任

线程间的通信主要是通过共享域和引用相同的对象。这种通信方式非常高效,不过可能会引发两种错误:线程干扰和内存一致性错误。防止这些错误发生的方法是同步。

阅读全文

Oracle官方并发教程之线程池

原文链接译文链接,译者:Greenster,校对:郑旭东

在java.util.concurrent包中多数的执行器实现都使用了由工作线程组成的线程池,工作线程独立于所它所执行的Runnable任务和Callable任务,并且常用来执行多个任务。

使用工作线程可以使创建线程的开销最小化。在大规模并发应用中,创建大量的Thread对象会占用占用大量系统内存,分配和回收这些对象会产生很大的开销。

阅读全文

Oracle官方并发教程之Executor接口

原文链接译文链接,译者:Greenster,校对:郑旭东

java.util.concurrent中包括三个Executor接口:

  • Executor,一个运行新任务的简单接口。
  • ExecutorService,扩展了Executor接口。添加了一些用来管理执行器生命周期和任务生命周期的方法。
  • ScheduledExecutorService,扩展了ExecutorService。支持Future和定期执行任务。

通常来说,指向Executor对象的变量应被声明为以上三种接口之一,而不是具体的实现类。 阅读全文

Java 7中的TransferQueue

原文链接译文链接,作者:Alex Miller,译者:Greenster,校对:梁海舰

Java7中加入了JSR 166y规范对集合类和并发类库的改进。其中的一项是增加了接口TransferQueue和其实现类LinkedTransferQueue

TransferQueue继承了BlockingQueueBlockingQueue又继承了Queue)并扩展了一些新方法。BlockingQueue(和Queue)是Java 5中加入的接口,它是指这样的一个队列:当生产者向队列添加元素但队列已满时,生产者会被阻塞;当消费者从队列移除元素但队列为空时,消费者会被阻塞。
阅读全文

可扩展的快速读写锁

原文链接(需翻墙) ,译文链接,  译者:中麦-张军 ,校对:梁海舰

介绍

读写锁是一种允许多个线程并发地访问一个或一组资源的并发结构,这意味着在实践中如果你有一个或一组几乎是以只读方式访问时,可以考虑使用读写锁(后文统称为RWLocks)来保护它们;
Java在java.util.concurrent.locks.ReentrantReadWriteLock中提供了一个很好的RWLocks,是由Doug Lea创建,它有很多特性如:重入,公平锁,锁降级等;

阅读全文

线程基础之“其他一些例子”

原文链接 , 译文链接,  译者: dabaosod011 ,校对:梁海舰

其他一些例子

我们对数据竞争的定义相当严格:必须以确切方式去执行原始、未经转换的程序中并行的冲突操作。引入有害的数据竞争将给编译器带来无法“打断”程序的负担。

阅读全文

Oracle官方并发教程之进程和线程

原文链接译文链接,译者:bjsuo,校对:郑旭东

在并发编程中,有两个基本的执行单元:进程和线程。在java语言中,并发编程最关心的是线程,然而,进程也是非常重要的。

阅读全文

Oracle官方并发教程之中断

原文链接译文链接译者: 蘑菇街-小宝   校对:梁海舰
中断是给线程的一个指示,告诉它应该停止正在做的事并去做其他事情。一个线程究竟要怎么响应中断请求取决于程序员,不过让其终止是很普遍的做法。这是本文重点强调的用法。
阅读全文

Oracle官方并发教程之不可变对象(定义不可变对象的策略)

原文链接译文链接,译者:Greenster,校对:郑旭东

以下的一些规则是创建不可变对象的简单策略。并非所有不可变类都完全遵守这些规则,不过这不是编写这些类的程序员们粗心大意造成的,很可能的是他们有充分的理由确保这些对象在创建后不会被修改。但这需要非常复杂细致的分析,并不适用于初学者。
阅读全文

编译Lambda表达式: Scala和Java 8

原文地址译文地址,译者:梁海舰, 校对:丁一

最近几年Lambda表达式风靡于编程界. 很多现代编程语言都把它作为函数式编程的基本组成部分. 基于JVM的编程语言如Scala,Groovy还有Clojure把它们作为关键部分集成在语言中.现在Java8也加入了它们的行列.

阅读全文

Oracle官方并发教程之不可变对象

原文链接译文链接,译者:Greenster,校对:郑旭东

一个对象如果在创建后不能被修改,那么就称为不可变对象。在并发编程中,一种被普遍认可的原则就是:尽可能的使用不可变对象来创建简单、可靠的代码。
阅读全文

return top