一种超时控制的方式

版权声明:本文为本作者原创文章,转载请注明出处。感谢 码梦为生| 刘锟洋 的投稿

今天看到 这篇文章:您还有心跳吗?超时机制分析   觉得挺有意思,有兴趣的同学可以先看看他的文章,简单记录了下自己的一个想法,无论好坏,权当参与讨论,共同进步吧。

其实 lz 一直限制在了取系统时间耗时的问题上,所以,一直想变相的通过各种手法排除掉获取系统时间的逻辑,比如使用“次数”来对连接实现超时控制,但其实,使用次数来表示超时控制本身就是个伪命题, 比如,在超时次数的阀值是100,如果在90次后,就一直没有被其他线程使用,一直不到阀值,那怎么去将这个连接释放掉呢?

所以,我想到了另外一种方式解决这个问题: 阅读全文

为什么无等待如此重要

原文地址 ,译文链接,译者:张军,校对:梁海舰

无锁(完全同步)

想象一下,一个无锁算法或数据结构有一个方法,这个方法所有执行过程都需要同步。假设在单线程模式下这个方法每次调用需要10ns,而每增加一个线程调用这个方法,将在同步状态(变量)上产生争用。
很显然,如果只有一个线程,每次调用该方法到返回平均时间都为10ns,我们称之为:每10ns完成的任务数;如果你增加更多的线程,他们将会增加其他线程执行完成的时间,这是因为同一时刻只有一个线程能获得锁;
记住,无锁(Lock-Free)保证一个线程可以执行,但没说是哪一个,并且在当前这个特定的例子中,每次只有一个线程可以执行(完成任务),其他线程不得不从头开始:
阅读全文

聊聊并发-Java中的Copy-On-Write容器

Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非常多的并发场景中使用到。

什么是CopyOnWrite容器

CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

阅读全文

Oracle官方并发教程之活跃度

原文地址译文地址,译者:李任,郑旭东 校对:蘑菇街-小宝

一个并发应用程序能及时执行的能力称为活跃性。本节将介绍最常见的活跃性问题:死锁(deadlock),以及另外两个活跃性问题:饥饿(starvation)和活锁(livelock)。

阅读全文

《Java 7并发编程实战手册》第五章Fork/Join框架

感谢人民邮电大学授权并发网发布此书样章,新书已上市,购买请进当当网Snip20140120_1

本章内容包含:

  • 创建Fork/Join线程池
  • 合并任务的结果
  • 异步运行任务
  • 在任务中抛出异常
  • 取消任务

5.1 简介

通常,使用Java来开发一个简单的并发应用程序时,会创建一些Runnable对象,然后创建对应的Thread 对象来控制程序中这些线程的创建、执行以及线程的状态。自从Java 5开始引入了ExecutorExecutorService接口以及实现这两个接口的类(比如ThreadPoolExecutor)之后,使得Java在并发支持上得到了进一步的提升。 阅读全文

无锁和无等待的定义和例子

原文链接译文连接,译者:周可人,校对:梁海舰

在查阅google之后,我发现没有一处对并发算法或是数据结构规定的演进条件(progress condition,注:参考[1],译者认为翻译为演进状态更为合适)做合理的解释。甚至在”The Art of Multiprocessor Programming“中也只有围绕书本的一小段定义,大部分定义是单行的句子,因而造成了我们普通人含义模糊的理解,所以在这里我把我对这些概念的理解整理在一起,并且在每一种概念后面给出相应的例子。

我们先将演进条件分为四个主要类别,阻塞(blocking),无干扰(obstruction-free),无锁(lock-free),和无等待(wait-free)。详细列表如下:
阅读全文

《Java 7并发编程实战手册》第四章线程执行器

感谢人民邮电大学授权并发网发布此书样章,新书购买传送门=》当当网Snip20140120_1

本章将介绍下列内容:

  • 创建线程执行器
  • 创建固定大小的线程执行器
  • 在执行器中执行任务并返回结果
  • 运行多个任务并处理第一个结果
  • 运行多个任务并处理所有结果
  • 在执行器中延时执行任务
  • 在执行器中周期性执行任务
  • 在执行器中取消任务
  • 在执行器中控制任务的完成
  • 在执行器中分离任务的启动与结果的处理
  • 处理在执行器中被拒绝的任务

阅读全文

无等待是不够的

原文地址译文链接,译者:许巧辉,校对:周可人

无等待是不够的

以目前针对演进条件(progress condition,注:参考[1])的算法和数据结构的分类来看,是不足以区分不同演进条件的能力和每一个演进条件的性能/延迟。

我们提出了一种新的“大O”记号来表示无等待的算法和数据结构。下面是它的工作原理:

一个算法或功能被称为“Wait-Free O(x)“,表示需要最多O(x)操作完成。

阅读全文

Oracle官方并发教程之线程对象

原文链接译文链接,译者:郑旭东

在Java中,每个线程都是Thread类的实例。并发应用中一般有两种不同的线程创建策略。

  • 直接控制线程的创建和管理,每当应用程序需要执行一个异步任务的时候就为其创建一个线程
  • 将线程的管理从应用程序中抽象出来作为执行器,应用程序将任务传递给执行器,有执行器负责执行。

这一节,我们将讨论Thread对象,有关Executors将在高级并发对象一节中讨论。

阅读全文

线程基础之数据竞争与锁

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

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

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

阅读全文

《Java 并发编程的艺术》迷你书

本文源自InfoQ发表的《Java 并发编程的艺术》电子书  作者:方腾飞  序言:张龙 免费下载此迷你书

250

推荐序

欣闻腾飞兄弟的《聊聊并发》系列文章将要集结成InfoQ迷你书进行发布,我感到非常的振奋。这一系列文章从最开始的发布到现在已经经历了两年多的时间,这两年间,Java世界发生了翻天覆地的变化。Java 7已经发布,而且Java 8也将在下个月姗姗来迟。围绕着JVM已经形成了一个庞大且繁荣的生态圈,Groovy、Scala、Clojure、Ceylon等众多JVM语言在蓬勃发展着,如今的Java已经不是几年前的Java了,众多运行在JVM上的编程语言为我们带来了更多的选择,提供了更好的机会。

纵观这几年的技术发展趋势,唱衰Java的论调一直都萦绕在我们耳边。不可否认,Java的发展确实有些缓慢,而且有些臃肿;但放眼望去,有如此之多的核心与关键系统依旧在使用Java进行开发并运行在JVM之上,这不仅得益于Java语言本身,强大的JVM及繁荣的Java生态圈在这其中更是发挥着重要的作用。在Java的世界中,我们想要完成一件事情有太多可用的选择了。

虽然如此,对于国内的一些开发人员来说,但凡提到Java,想到的都是所谓的SSH(Struts、Spring及Hibernate等相关框架)。不可否认,这些框架对于我们又快又好地完成任务起到了至关重要的推进作用,然而Java并不是SSH,SSH也不是Java的代名词。 阅读全文

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

原文地址译文地址

译者:李任

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

FutureTask 源码解析

版权声明:本文为本作者原创文章,转载请注明出处。感谢 码梦为生| 刘锟洋 的投稿

站在使用者的角度,future是一个经常在多线程环境下使用的Runnable,使用它的好处有两个:
1. 线程执行结果带有返回值
2. 提供了一个线程超时的功能,超过超时时间抛出异常后返回。

那,怎么实现future这种超时控制呢?来看看代码:

F1

阅读全文

Java Magic. Part 4: sun.misc.Unsafe

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

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

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

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

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

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

return top