JAVA ’ 目录归档

并发工具类(四)两个线程进行数据交换的Exchanger

简介

Exchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据, 如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。

Exchanger的应用场景

Exchanger可以用于遗传算法,遗传算法里需要选出两个人作为交配对象,这时候会交换两人的数据,并使用交叉规则得出2个交配结果。
Exchanger也可以用于校对工作。比如我们需要将纸制银流通过人工的方式录入成电子银行流水,为了避免错误,采用AB岗两人进行录入,录入到Excel之后,系统需要加载这两个Excel,并对这两个Excel数据进行校对,看看是否录入的一致。代码如下:

阅读全文

java锁的种类以及辨析(一):自旋锁

作者:山鸡

锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及。本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑。

1、自旋锁

自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区。如下

阅读全文

并发工具类(三)控制并发线程数的Semaphore

简介

Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。很多年以来,我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是控制流量的红绿灯,比如XX马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶入XX马路,但是如果前一百辆中有五辆车已经离开了XX马路,那么后面就允许有5辆车驶入马路,这个例子里说的车就是线程,驶入马路就表示线程在执行,离开马路就表示线程执行完成,看见红灯就表示线程被阻塞,不能执行。

应用场景

Semaphore可以用于做流量控制,特别公用资源有限的应用场景,比如数据库连接。假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程并发的读取,但是如果读到内存后,还需要存储到数据库中,而数据库的连接数只有10个,这时我们必须控制只有十个线程同时获取数据库连接保存数据,否则会报错无法获取数据库连接。这个时候,我们就可以使用Semaphore来做流控,代码如下:
阅读全文

并发工具类(二)同步屏障CyclicBarrier

简介

CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。

阅读全文

Harris’s Linked List

原文地址 作者:Pedro Ramalhete,译者:叶磊,校对:周可人

在学术论文中Harris Linked List是使用最广泛的并发数据结构之一。

Harris Linked List是一个基于linked-list的并发有序set(或者是map),可进行无锁性质的插入,删除和查找操作。

http://research.microsoft.com/pubs/67089/2001-disc.pdf

这篇文章最早在2001年的DISC会议上发表,作者是Tim Harris,目前在Oracle就职。

https://labs.oracle.com/pls/apex/f?p=labs:bio:0:296

阅读全文

Java设计模式:策略模式

原文链接 译者:秦建平

下面是一个有关于策略模式的故事。假设Mike在开车的时候,会很频繁的加速,有一天因为超速他被一个警察拦下来了。有可能这个警察会比较友好,没开任何罚单就让Mike把车开走了。(我们把这类型的警察称之为“NicePolice”)。也有可能Mike遇到了一个不太友好的警察,然后这个警察给Mike出具了一张罚单。(我们把这类型的警察称之为“HardPolice”)。
Mike其实并不知道他会遇到什么类型的警察,直到他因为超速而被警察要求停车下来,实际上这就是一种程序当中“运行时”的概念,只有在运行的时候,才知道,到底会遇到什么类型的警察,实际上这就是“策略模式”。

阅读全文

JAVA 9 新特性

JavaLam-1原文地址 作者:Coman Hamilton 译者:zachariah 校对:方腾飞

Oracle已将JAVA 9的开发提上日程。OpenJDK上已经出现了关于下一个主版本JAVA 9的改进建议(JEP)。与以往不同,Oracle在这次谈及了一些真正的特性。而早期对于JDK9的声明仅限于“bug修复和一些小的改进”。

译者注:有兴趣的同学可以看看JEP 地址如下 http://openjdk.java.net/jeps/0

校对注:JAVA还是包袱太重,更新特性非常谨慎和缓慢。

阅读全文

我和Netty的故事

本文首发于InfoQ架构师杂志。

还在上学的时候,我特别好奇QQ是怎么实现的,为什么我一发消息我的好友马上就能收到且基本没有延迟,它的原理是什么?大三的时候,我学习了Java语言,接触到了Socket编程,不知天高地厚的我当时居然想自己实现个简易QQ,和几个朋友做了技术评估后觉得这个事好像不是那么难,紧接着我们就用Swing以及一些Socket编程知识完成了一个简易的局域网QQ,虽然功能不是那么的稳定,但基本上还是可以实现私聊、群聊、文件传输、抖屏功能。这也许是我第一次接触网络通信,核心功能部分使用了同步I/O的Socket类库。

阅读全文

Java设计模式:观察者

原文链接 译者:秦建平

简单来说,观察者模式=发布者+订阅者。

下面是一个有关猎头的典型的例子。在下面这张图当中有两个角色:猎头和寻找工作的人。找工作的人向猎头订阅,告知自己希望得到一份工作,当有新的工作机会的时候,猎头就会把这个信息通知给曾经向他订阅过的人。

阅读全文

了解 CMS 垃圾回收日志

原文地址   作者: poonam 译者:严亮 校对:梁海舰

在CMS GC 时,使用参数-XX:+PrintGCDetails-XX:+PrintGCTimeStamps 会输出很多日志信息,了解这些信息可以帮我们更好的调整参数,以获得更高的性能。

我们来看下在JDK1.4.2_10 中CMS GC日志示例:

39.910: [GC 39.910: [ParNew: 261760K->0K(261952K), 0.2314667 secs] 262017K->26386K(1048384K), 0.2318679 secs]
新生代使用 (ParNew 并行)回收器。新生代容量为261952K,GC回收后占用从261760K降到0,耗时0.2314667秒。(译注:262017K->26386K(1048384K), 0.2318679 secs 表示整个堆占用从262017K 降至26386K,费时0.2318679)

阅读全文

处理JSON的Java API :JSON的简介

原文链接  作者:Jitendra Kotamraju   译者:撒木

处理JSON的各种解析、生成、处理、转换和查询的JAVA API

JSON (JavaScript Object Notation)是一种轻量级的、基于文本的、完全独立于语言的数据交换格式。它非常方便人们和机器的阅读和书写。JSON 有两种结构类型的表现方式对象和数组。对象是名/值对的无序集合。数组是值(value)的有序集合。值的类型可以是字符串(在双引号中)、数字(整数或浮点数)、逻辑值(true或false)、数组(在方括号中)、对象(在花括号中)、null。

阅读全文

并发工具类(一)等待多线程完成的CountDownLatch

简介

CountDownLatch 允许一个或多个线程等待其他线程完成操作。

应用场景

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。在这个需求中,要实现主线程等待所有线程完成sheet的解析操作,最简单的做法是使用join。代码如下:

阅读全文

Java创建线程安全的方法

原文链接 译者:秦建平 校对:方腾飞

首先来看一个问题:

下面这个方法是线程安全的吗?如何才能让这个方法变成线程安全的?

[code lang=”java”]

public class MyCount {
private static int counter = 0;

public static int getCount(){
return counter++;
}
}
[/code]

阅读全文

一个api的 rt 大涨问题排查

感谢同事[空蒙]投递此稿

mtop是移动接入网关平台,对客户端暴露api,后端接api实际的应用服务,有HSF,也有http的服务端。

之前进行了机房从杭州搬迁到上海,在搬迁的过程中,其中一个api的rt突然大涨,(之前平均的约210ms)

chart_2_

分析具体的原因了,当时正机房搬迁,首先考虑的就是是否此影响,是否发生了跨机房调用的导致,当时把整个杭州的后端服务全部干掉,确认没有跨机房调用,但rt还是没有降低,仍旧很高。 阅读全文

Java线程状态图

下图很好的描述了Java的线程状态。

threads2

 

阅读全文

return top