Archive for the ‘ JAVA ’ Category

线程基础之JAVA和C++0x的特性

译文连接   译文地址  译者:衣着时   校对:丁一    (有兴趣参与试译或校对的同学,请加入并发网试译者QQ群:369468545)

JAVA特性

JAVA线程通常是一个带有run()方法的java.lang.Thread的子类,然后调用这个子类对象的start()方法。我们之前定义过,数据竞争是因为两个线程同时访问内存单元,在JAVA中,内存单元是一个对象字段或数组元素。

由于JAVA旨在支持运行不受信任代码作为受信任的应用程序的一部分,必须限制不受信任代码的数据争用造成的破坏。因此不允许数据争用的任意行为,所以,JAVA语言规范包含了一个复杂的规则集,用来定义线程间的共享对象的行为,包括数据争用的行为,这些规则的影响甚至专家都觉得惊讶。然而这些规则保证了免除数据争用的程序的连续一致,对于程序来讲是个更加容易的模型。

如上所述JAVA的数据争用定义的可替换的定义是,并发冲突操作必须被阻止同时出现通过执行相同的线程,或者引入强制实施线程间的顺序的同步变量。如果采用了这些机制,就可以说一个内存操作发生在另一个内存操作之前。因此不会发生交叉存储。这基本相当于我们的定义。 Read more

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 线程基础之JAVA和C++0x的特性

并发网2014.9月阅读量Top10

ICON4金秋已过,转眼又到了月底,并发网9月Top10的阅读量的文章新鲜送到,希望各位看官能喜欢!有任何意见和建议,欢迎告诉我们,我们在努力!~祝大家国庆节快乐

锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及……(2,047 人阅读)

Read more

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 并发网2014.9月阅读量Top10

学会放下包袱,热爱单例

原文链接   译者:曾维朝

企业应用程序与移动应用程序有着截然不同的要求。你启动一次企业应用程序,它会连续运行数月或数年。另一方面,大部分手机应用可能是被正在无聊排队或者坐公交车的用户启动的,它们经常连续运行不超过几分钟,这就意味着移动应用程序必须即时开启,而启动一个企业应用程序则需要足够长的时间。

对于企业应用,依赖注入和早期验证是非常重要的, Spring为此提供了极大的便利。 但是别欺骗自己,Spring是好,但它不是万金油。尤其在崇尚快速启动、低内存消耗、避免接口的移动开发领域。

Read more

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 学会放下包袱,热爱单例

Java锁的种类以及辨析(三):阻塞锁

下载作者:山鸡

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

Read more

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java锁的种类以及辨析(三):阻塞锁

Java锁的种类以及辨析(二):自旋锁的其他种类

下载

作者:山鸡

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

Read more

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java锁的种类以及辨析(二):自旋锁的其他种类

Java网络教程之Socket

原文地址  译者:贾毅

当我们想要在Java中使用TCP/IP通过网络连接到服务器时,就需要创建java.net.Socket对象并连接到服务器。假如希望使用Java NIO,也可以创建Java NIO中的SocketChannel对象。

创建Socket

下面的示例代码是连接到IP地址为78.64.84.171服务器上的80端口,这台服务器就是我们的Web服务器(www.jenkov.com),而80端口就是Web服务端口。

Socket socket = new Socket("78.46.84.171", 80);

我们也可以像如下示例中使用域名代替IP地址:

Socket socket = new Socket("jenkov.com", 80);

Read more

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java网络教程之Socket

Java 8新特性:字符串去重

本文首发与InfoQ

8月19日,Oracle发布了JDK 8u20,JDK 8u20包含很多新特性,比如Java编译器更新、支持在运行时通过API来修改MinHeapFreeRatio和MaxHeapFreeRatio参数、新的GC调优指南文档。不过在众多新特性中,最令人期待的还属字符串去重(String Deduplication )。如何减少内存占用一直是一个永恒的话题,而在Java应用中,经常会看到String对象会占用应用30%的内存,它是Java中最常用的对象之一。新的字符串去重特性可以帮助减少应用中String对象的内存占用,目前该特性只适用于G1垃圾收集器,并且默认不被开启。

Read more

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java 8新特性:字符串去重

深度解析Java8 – AbstractQueuedSynchronizer的实现分析(上)

本文首发在infoQ :www.infoq.com/cn/articles/jdk1.8-abstractqueuedsynchronizer

前言:

Java中的FutureTask作为可异步执行任务并可获取执行结果而被大家所熟知,通常可以使用future.get()来获取线程的执行结果,在线程执行结束之前,get方法会一直阻塞状态,直到call()返回,其优点是使用线程异步执行任务的情况下还可以获取到线程的执行结果,但是FutureTask的以上功能却是依靠通过一个叫AbstractQueuedSynchronizer的类来实现,至少在JDK 1.5、JDK1.6版本是这样的(从1.7开始FutureTask已经被其作者Doug Lea修改为不再依赖AbstractQueuedSynchronizer实现了,这是JDK1.7的变化之一)。但是AbstractQueuedSynchronizer在JDK1.8中还有如下图所示的众多子类:

Read more

Java 8: Lambdas, Part 1

原文链接  作者:Ted Neward  译者:赵峰

了解Java8 中的lambda表达式

对开发人员来说没有什么比自己选择的语言或平台发布新版本更令人激动了。Java开发者也不例外。实际上,我们更期待新版本的发布,有一部分原因是因为在不久前我们还在考虑Java的前途,因为Java的创造者——Sun在衰落。一次与死亡的擦肩而过会使人更加珍惜生命。但在这种情况下,我们的热情来源不像以前发布版本时那样,这次是来源于事实。Java 8最终会获得一些我们期待了几十年的“现代”语言特性。

当然,Java 8主要的改变集中在lambdas(或者叫闭包),这也是这两篇文章主要讨论的内容。但是一个语言特性,就其本身而言它的出现除非其背后有一定的支持,如果它不实用或有趣。Java 7的几个特点符合这种描述:例如,增强数值文本不能让大多数人注意。

Read more

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java 8: Lambdas, Part 1

Java锁的种类以及辨析

下载

作者:山鸡

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

Read more

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java锁的种类以及辨析

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

简介

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

Exchanger的应用场景

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

Read more

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 并发工具类(四)两个线程进行数据交换的Exchanger

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

作者:山鸡

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

1、自旋锁

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

Read more

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: java锁的种类以及辨析(一):自旋锁

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

简介

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

应用场景

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

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 并发工具类(三)控制并发线程数的Semaphore

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

简介

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

Read more

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 并发工具类(二)同步屏障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

Read more

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Harris’s Linked List

return top