多线程-并发
Java码界探秘
本博客不再维护,搬家到 http://zthinker.com。个人公众号(Java码界探秘)
展开
-
Java 并发编程实战学习笔记——路径查找类型并行任务的终止
1.该类问题的递归串行算法(深度优先遍历)代码 复制 - 运行package net.jcip.examples; import java.util.*; /** * SequentialPuzzleSolver * * Sequential puzzle solver * * @author Brian Goetz and Tim Peierl原创 2013-11-12 18:00:14 · 1016 阅读 · 0 评论 -
Java的Lock小结
多核时代 摩尔定律告诉我们:当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍。换言之,每一美元所能买到的电脑性能,将每隔18个月翻两倍以上。然而最近摩尔定律似乎遇到了麻烦,目前微处理器的集成度似乎到了极限,在目前的制造工艺和体系架构下很难再提高单个处理器的速度了,否则它就被烧坏了。所以现在的芯片制造商改变了策略,转而在一个电路板上集成更多的转载 2013-11-13 21:37:12 · 1073 阅读 · 0 评论 -
JAVA并发编程学习笔记之AQS源码分析
同步状态AQS采用的是CLH队列,CLH队列是由一个一个结点构成的,前面提到结点中有一个状态位,这个状态位与线程状态密切相关,这个状态位(waitStatus)是一个32位的整型常量,它的取值如下:[java] view plaincopyprint?static final int CANCELLED = 1; static转载 2013-11-13 18:50:26 · 1372 阅读 · 0 评论 -
CLHLock的实际应用
//: concurrency/BasicThreads.java// The most basic use of the Thread class.public class BasicThreads { public static void main(String[] args) { Counter counter = new Counter(); for (int i = 0;原创 2013-11-14 21:15:20 · 739 阅读 · 0 评论 -
Java线程池架构2-多线程调度器
http://ifeve.com/java线程池架构2-多线程调度器(scheduledthreadpoolexecutor)/在前面介绍了java的多线程的基本原理信息:《Java线程池架构原理和源码解析(ThreadPoolExecutor)》,本文对这个java本身的线程池的调度器做一个简单扩展,如果还没读过上一篇文章,建议读一下,因为这是调度器的核心组件部分。 我们如果转载 2014-01-08 15:39:24 · 657 阅读 · 0 评论 -
您还有心跳吗?超时机制分析
http://ifeve.com/how-to-do-timeout/问题描述 在C/S模式中,有时我们会长时间保持一个连接,以避免频繁地建立连接,但同时,一般会有一个超时时间,在这个时间内没发起任何请求的连接会被断开,以减少负载,节约资源。并且该机制一般都是在服务端实现,因为client强制关闭或意外断开连接,server端在此刻是感知不到的,如果放到client端实现,在上转载 2014-01-08 15:40:01 · 675 阅读 · 0 评论 -
JDK 7 中的 Fork/Join 模式
轻松实现多核时代的并行计算随着多核时代的来临,软件开发人员不得不开始关注并行编程领域。而 JDK 7 中将会加入的 Fork/Join 模式是处理并行编程的一个经典的方法。虽然不能解决所有的问题,但是在它的适用范围之内,能够轻松的利用多个 CPU 提供的计算资源来协作完成一个复杂的计算任务。通过利用 Fork/Join 模式,我们能够更加顺畅的过渡到多核的时代。本文将介绍使用转载 2013-12-27 09:35:31 · 829 阅读 · 0 评论 -
推荐初中级开发者的书籍 – Java 7 并发手册
《Java 7 并发手册》(《Java 7 Concurrency Cookbook》)这本书里包含了超过60个展示Java多线程编程的实例。这本书里讲解了关于线程的很多主题,从初级到高级,有线程管理,例如创建、中断和监视线程,有通过Java 5的Executor框架来运行和调度线程,以及使用Java 7中最新的Fork/Jion框架来分发线程。我最喜欢的是第3章,这里面展示了5种并转载 2014-01-23 13:44:56 · 569 阅读 · 0 评论 -
Java ScheduledThreadPoolExecutor延迟或周期性执行任务
ImportNew注: 本文由新浪微博:@小飞侠_thor 投稿至ImportNew。感谢@小飞侠_thor ! 如果你希望分享好的原创文章或者译文,欢迎投稿到ImportNew。Java提供的Time类可以周期性地或者延期执行任务,但是有时我们需要并行执行同样的任务,这个时候如果创建多个Time对象会给系统带来负担,解决办法是将定时任务放到线程池中执行。Java的Schedu转载 2014-01-24 20:31:32 · 707 阅读 · 0 评论 -
Fork/Join框架之Fork、Join操作
ForkFork就是一个不断分枝的过程,在当前任务的基础上长出n多个子任务。当一个ForkJoinTask任务调用fork()方法时,当前线程会把这个任务放入到queue数组的queueTop位置,然后执行以下两句代码:[java] view plaincopyprint?if ((s -= queueBase) 2) po转载 2013-11-13 18:51:05 · 826 阅读 · 0 评论 -
Java Concurrent
本文节选自 Effective Java by Joshua Bloch 和 Concurrent Programming in Java by Doug Lea. 1.1 概述 多线程程序设计比单线程程序设计要困难的多,所以,如果一个库中的类能够帮助你从低层的多线程程序设计中解脱出来,那么一定要使用这个类。比如java.util.Timer。另外,util.concu转载 2013-11-13 18:55:04 · 910 阅读 · 0 评论 -
JAVA并发编程学习笔记之Unsafe类
java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能:1、通过Unsafe类可以分配内存,可以释放内存;类中提供的3个本地方法allocateMemory、reallocateMemory、freeMemory分别用于分配内存,扩充内存和释放内存,与C语言中的3个方法对应。2、可以定位对象某字段的内存位置,也可以修改对象的转载 2013-11-13 17:49:32 · 726 阅读 · 0 评论 -
Java 并发编程实战学习笔记——CountDownLatch的使用
public class CountDownLatchextends Object一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立转载 2013-11-12 18:00:57 · 750 阅读 · 0 评论 -
callable结合FutureTask的多线程使用(免打扰模式)
import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;/** * * @author Kaiwii Ho * Callable类就是一个有返回值的任务 * 对于任务与Thre转载 2013-11-12 18:52:09 · 774 阅读 · 0 评论 -
AbstractQueuedSynchronizer源码解析之ReentrantLock(一)
在上一篇笔记中提到concurrent包中semaphores, barriers, and latches等Synchronizer的介绍和使用,于是想深入的了解这些Synchronizer的原理和源码。可以从上图中观察到这些Synchronizer内部都有自己的Sync类,而且Sync类全部继承AbstractQueuedSynchronizer抽象类,可以看出AbstractQueuedSy转载 2013-11-13 08:44:28 · 1017 阅读 · 0 评论 -
AbstractQueuedSynchronizer源码解析之ReentrantLock(二)
上篇文章分析了ReentrantLock的lock,tryLock,unlock方法,继续分析剩下的方法,首先开始lockInterruptibly,先看其API说明:lockInterruptiblypublic void lockInterruptibly()throws Acquires the lock unless the current thread is .Acqui转载 2013-11-13 08:46:32 · 839 阅读 · 0 评论 -
java 中的Unsafe
在阅读AtomicInteger的源码时,看到了这个类:sum.msic.Unsafe,之前从没见过。所以花了点时间google了一下。 Unsafe的源码:http://www.docjar.com/html/api/sun/misc/Unsafe.java.html Unsafe源码中的描述如下: 写道A collection of m转载 2013-11-13 12:23:10 · 776 阅读 · 0 评论 -
JAVA并发编程学习笔记之CLH队列锁
NUMA与SMPSMP(Symmetric Multi-Processor),即对称多处理器结构,指服务器中多个CPU对称工作,每个CPU访问内存地址所需时间相同。其主要特征是共享,包含对CPU,内存,I/O等进行共享。SMP的优点是能够保证内存一致性,缺点是这些共享的资源很可能成为性能瓶颈,随着CPU数量的增加,每个CPU都要访问相同的内存资源,可能导致内存访问冲突,可能会导致CPU资源的浪转载 2013-11-13 17:43:17 · 759 阅读 · 0 评论 -
AbstractQueuedSynchronizer的介绍和原理分析
简介提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架。该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础。使用的方法是继承,子类通过继承同步器并需要实现它的方法来管理其状态,管理的方式就是通过类似acquire和release的方式来操纵状态。然而多线程环境中对状态的操纵必须确保原子性,因此子类对于状态的把握,需要使用这个同转载 2013-11-13 18:05:37 · 726 阅读 · 0 评论 -
JAVA并发编程学习笔记之synchronized
监视器java中同步是通过监视器模型来实现的,JAVA中的监视器实际是一个代码块,这段代码块同一时刻只允许被一个线程执行。线程要想执行这段代码块的唯一方式是获得监视器。监视器有两种同步方式:互斥与协作。多线程环境下线程之间如果需要共享数据,需要解决互斥访问数据的问题,监视器可以确保监视器上的数据在同一时刻只会有一个线程在访问。什么时候需要协作?比如:一个线程向缓冲区写数据,另一个线转载 2013-11-13 18:48:46 · 661 阅读 · 0 评论 -
关于 java.util.concurrent.RejectedExecutionException
遇到java.util.concurrent.RejectedExecutionException目前看来,最主要有2种原因。第一:你的线程池ThreadPoolExecutor 显示的shutdown()之后,再向线程池提交任务的时候。 如果你配置的拒绝策略是AbortPolicy的话,这个异常就会抛出来。第二:当你设置的任务缓存队列过小的时候,或者说, 你的线程池里面所转载 2014-02-21 23:16:41 · 6428 阅读 · 0 评论 -
Java线程池Executors
一 简述 线程池,作为一个管理一组同构工作线程的资源。接受提交的任务,利用线程池中的线程进行工作的处理。 在另一篇《Java多线程设计模式(4)线程池模式》利用非Executors描述了线程池基本构建过程,对于线程池基本机制进行了说明。由于Java类库中有Executor来专门用于线程池的管理的类,所以可以用Executor任务执行框架来实现线程池的构建。 Executor转载 2014-02-24 09:49:40 · 668 阅读 · 0 评论 -
ScheduledThreadPoolExecutor与System#nanoTime
一直流传着Timer使用的是绝对时间,ScheduledThreadPoolExecutor使用的是相对时间,那么ScheduledThreadPoolExecutor是如何实现相对时间的?先看看ScheduledThreadPoolExecutor中实现定时调度的模型,很简单,内部用了无界的DelayQueue作为线程池的队列,而DelayQueue的内部又使用的是一个PriorityQ转载 2014-03-18 18:08:29 · 641 阅读 · 0 评论 -
Java Timer&TimerTask原理分析
如果你使用Java语言进行开发,对于定时执行任务这样的需求,自然而然会想到使用Timer和TimerTask完成任务,我最近就使用 Timer和TimerTask完成了一个定时执行的任务,实现得没有问题,但当在TimerTaks的run()方法中使用 Thread.sleep()方式时,可能会出现奇怪的现象,好像Timer失效了,网上查了一下,倒是有人遇到了相同的问题,但是并没有找到一篇解释为什么转载 2014-03-18 16:58:24 · 766 阅读 · 0 评论 -
Java多线程编程的常见陷阱
本文介绍了Java多线程编程中的常见陷阱,如在构造函数中启动线程,不完全的同步,在使用某个对象当锁时,改变了对象的引用,导致同步失效等等。AD:1、在构造函数中启动线程我在很多代码中都看到这样的问题,在构造函数中启动一个线程,类似这样:public class A{ public A(){ this.x=1;转载 2012-02-14 20:25:54 · 527 阅读 · 0 评论 -
Java FutureTask理解
尊敬原创作者,转载请注明出处:http://blog.csdn.net/gemmem/article/details/8956703FutureTask是为了弥补Thread的不足而设计的,它可以让程序员准确地知道线程什么时候执行完成并获得到线程执行完成后返回的结果(如果有需要)。java.util.concurrent 类 FutureTaskjava转载 2013-11-12 18:55:12 · 714 阅读 · 0 评论 -
happens-before俗解
学习Java并发,到后面总会接触到happens-before偏序关系。初接触玩意儿简直就是不知所云,下面是经过一段时间折腾后个人对此的一点浅薄理解,希望对初接触的人有帮助。如有不正确之处,欢迎指正。synchronized、大部分锁,众所周知的一个功能就是使多个线程互斥/串行的(共享锁允许多个线程同时访问,如读锁)访问临界区,但他们的第二个功能 —— 保证变量的可见性 —— 常被遗忘。转载 2014-03-18 17:58:47 · 727 阅读 · 0 评论 -
Future和FutureTask
一 Future Pattern 假如有一个执行起来需要花费一些时间的方法,为了省去不必要的等待执行结果出来,继续做别的事情,则可以事先获取一个“提货单”即Future参与者,Future Pattern模式也就是这样的方式,当一个线程需要另一个线程的处理的结果时候,则不必一直等着处理结果,可以先处理别的事情,提前拿个Future对象,再过一段时间来获取另一个线程的处理结果。转载 2013-10-08 18:09:10 · 518 阅读 · 0 评论 -
ScheduledThreadPoolExecutor实现原理
自jdk1.5开始,Java开始提供ScheduledThreadPoolExecutor类来支持周期性任务的调度,在这之前,这些工作需要依靠Timer/TimerTask或者其它第三方工具来完成。但Timer有着不少缺陷,如Timer是单线程模式,调度多个周期性任务时,如果某个任务耗时较久就会影响其它任务的调度;如果某个任务出现异常而没有被catch则可能导致唯一的线程死掉而所有任务都不会再被调转载 2014-03-18 17:41:09 · 852 阅读 · 0 评论 -
Java单例对象同步问题探讨
在本文中,作者向大家讲述了Single Call 模式的原理,同时也介绍了Single Call 模式的实现问题。 评论:邓明 (dengming@cn.ibm.com), 高级信息系统工程师, IBM中国有限公司 商业咨询服务部2003 年 12 月 10 日内容单例对象(Singleto转载 2013-10-07 22:16:25 · 683 阅读 · 0 评论 -
Java并发基础构建模块简介
在实际并发编程中,可以利用synchronized来同步线程对于共享对象的访问,用户需要显示的定义synchronized代码块或者方法。为了加快开发,可以使用Java平台一些并发基础模块来开发。 注:关于容器类中的常见并发容器和同步容器的类图,详见另一篇文章《Java集合框架图》一 同步容器类 同步容器类主要包括Vector和Hashtable,都是通过Coll转载 2014-03-17 21:27:02 · 538 阅读 · 0 评论 -
Java 理论与实践: 并发在一定程度上使一切变得简单
util.concurrent 包简介对于每个项目,象许多其它应用程序基础结构服务一样,通常无需从头重新编写并发实用程序类(如工作队列和线程池)。这个月,Brian Goetz 将介绍 Doug Lea 的 util.concurrent包,这是一个高质量的、广泛使用的、并发实用程序的开放源码包。可以通过本文的 论坛提出您对本文的想法,以飨笔者和其他读者。(您也可以单击本文转载 2014-03-17 21:26:46 · 525 阅读 · 0 评论 -
Java里快如闪电的线程间通讯
这个故事源自一个很简单的想法:创建一个对开发人员友好的、简单轻量的线程间通讯框架,完全不用锁、同步器、信号量、等待和通知,在Java里开发一个轻量、无锁的线程内通讯框架;并且也没有队列、消息、事件或任何其他并发专用的术语或工具。只用普通的老式Java接口实现POJO的通讯。它可能跟Akka的类型化actor类似,但作为一个必须超级轻量,并且要针对单台多核计算机进行优化的新框架,那个转载 2014-03-15 17:42:57 · 660 阅读 · 0 评论 -
Java并发基础构建模块简介
在实际并发编程中,可以利用synchronized来同步线程对于共享对象的访问,用户需要显示的定义synchronized代码块或者方法。为了加快开发,可以使用Java平台一些并发基础模块来开发。 注:关于容器类中的常见并发容器和同步容器的类图,详见另一篇文章《Java集合框架图》一 同步容器类 同步容器类主要包括Vector和Hashtable,都是通过Coll转载 2014-02-24 09:58:18 · 647 阅读 · 0 评论 -
Java多线程设计模式
1 线程中的几个方法解释Thread.sleep(long 毫秒)在指定的时间内让当前线程休眠,将控制权交给其他线程,休眠的线程依旧拥有它所占用的锁,Thread.yield();暂停或者放弃当前正在执行的线程,并且执行其他线程,但是并没有释放该线程所拥有的锁,线程放弃后,让其他相同或者更高线程得以运行。t.join()在A线程中等待t线程,可以指定转载 2014-02-24 10:12:29 · 544 阅读 · 0 评论 -
Java并发显式锁和显式条件队列
一 显式锁 在类中利用synchronized修饰的方法或者this代码块,均使用的是类的实例锁或者类的锁。这些锁都称为内置锁。 可以利用显式锁进行协调对象的访问。即ReentrantLock。这是一种可以提供无条件,可轮询,定时以及可中断的锁获取操作。对于锁的所有加锁和解锁都是显式的。常规的内置锁是无法中断一个正在等待获取锁的线程,以及无法在请求获取一个锁的无限等待下转载 2014-02-24 09:49:12 · 953 阅读 · 0 评论 -
怎么理解Condition
原文出处: liuinsect感谢文章作者@Jd刘锟洋 的投稿。如果其他朋友也希望自己的 Java 和 Android 技术文章发表在 ImportNew,可以微博私信联系@ImportNew,或者邮箱联系ImportNew.com@gmail.com。在java.util.concurrent包中,有两个很特殊的工具类,Condition和ReentrantLock,使用转载 2014-02-11 17:45:54 · 1561 阅读 · 0 评论 -
JUC (Java Util Concurrency) 基础内容概述
目录[-]转自:http://www.goldendoc.org/2011/05/juc/1. JUC概况2. 原子操作3. 指令重排4. Happens-before法则:(Java 内存模型)JMM的特性:volatile语义:5. CAS操作6. Lock 锁7. AQSAQS实现:Atomically managing synchro转载 2014-03-15 17:09:32 · 749 阅读 · 0 评论 -
Java的多线程编程模型5--从AtomicInteger开始(自增长实现)
AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。来看AtomicInteger提供的接口。//获取当前的值public final int get()//取当前的值,并设置转载 2014-03-15 12:51:16 · 1107 阅读 · 0 评论 -
zookeeper 分布式锁服务
分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那一层来挡。当大量的行锁、表锁、事务充斥着数据库的时候。一般web应用很多的瓶颈都在数据库上,这里给大家介绍的是减轻数据库锁负担的一种方案,使用zookeeper分布式锁服务。zookeeper是hadoop下面的一个子项目, 用来协调跟hadoop相关的一些分布式的框架, 如hadoop, hive, pig等, 其实他们转载 2014-03-16 19:07:55 · 764 阅读 · 0 评论