
多线程与并发编程
文章平均质量分 81
iteye_5555
这个作者很懒,什么都没留下…
展开
-
java5中使用interrupt()来停止java线程的方法(转)
在开发java多线程时,如果要停止线程这个问题很头痛吧,不过在Java5的java.util.concurrent中使用interrupt(),让线程在run方法中停止。简介在Java的多线程编程中,java.lang.Thread类型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy() and res...原创 2010-08-18 23:24:59 · 106 阅读 · 0 评论 -
从JVM并发看CPU内存指令重排序(Memory Reordering)
我们都知道,现在的计算机,cpu在计算的时候,并不总是从内存读取数据,它的数据读取顺序优先级是:寄存器-高速缓存-内 存。线程耗费的是CPU,线程计算的时候,原始的数据来自内存,在计算过程中,有些数据可能被频繁读取,这些数据被存储在寄存器和高速缓存中,当线程计算完后,这些缓存的数据在适当的时候应该写回内存。当个多个线程同时读写某个内存数据时,就会产生多...原创 2011-04-18 16:17:01 · 158 阅读 · 0 评论 -
Java 并发编程基础-共享对象
Java 并发编程基础-共享对象 目录Java 并发编程基础-共享对象... 11. 可见性... 11.1过期数据... 21.2 非原子的...原创 2011-04-19 14:48:07 · 488 阅读 · 0 评论 -
CountDownLatch的使用实例
CountDownLatch CountDownlatch,是一种Sychronizer,它可以延迟线程的进度直到线程的进度到线程到达终止状态。 它本身而言是Java并发包中非常有用的一个类,它可以让某些任务完成以后再继续运行下面的内容,每个任务本身执行完毕后让计数器减一,直到计数器清零后,以下的内容才可以继续运行,否则将阻塞等待。 想了一下,这个场景非常适合用于项...原创 2011-04-26 22:20:58 · 165 阅读 · 0 评论 -
FutureTask的使用方法和使用实例
FutureTask是一种可以取消的异步的计算任务。它的计算是通过Callable实现的,它等价于可以携带结果的Runnable,并且有三个状态:等待、运行和完成。完成包括所有计算以任意的方式结束,包括正常结束、取消和异常。 Future有个get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常。 Executor框架利用Futur...原创 2011-04-27 15:34:42 · 271 阅读 · 0 评论 -
Semaphore的介绍和使用实例
Semaphore可以用来控制能够同时发给你问某个特定资源的活动的数量或者同时给定操作的数量。计数信号量可以用来实现资源池或者一个容器限定边界。 一个Semaphore管理一个有效许可集合。许可的初始量通过构造函数传递给Semaphore,活动可以获取许可(只要还有剩余的许可),并在使用之后释放许可。获取许可的语法是semaphore.acquire(),如果没有剩余许可,则acquire...原创 2011-04-27 22:32:26 · 176 阅读 · 0 评论 -
CopyOnWriteArrayList工作原理和实例
CopyOnWriteArrayList顾名思义,在写入操作时,copy源数组到新的数组中,而读取时,是从源数组去读的,因为写入操作是在另外一个数组中执行,因此在读取时,不用进行线程同步,但是要注意一点,copy数组的开销在数据量大的情况下,非常耗资源,因此,它的使用场景,适合于读取远大于写入操作的场景。当然,在写入时,是有锁的,JDK中的实现是采用重入显式锁进行锁定的。当写操作完成以后再将源数组...原创 2011-05-05 23:43:13 · 301 阅读 · 0 评论 -
CyclicBarrier的使用实例
CyclicBarrier允许给定数量的线程全部到达关卡点时,关卡就被成功突破,关卡被重置以备下一次使用。跟CountDownlatch特别类似,但是CountDownLatch不同的是不能被重新重置再使用。 前面的blog说到用countdownlatch去完成方法里面的3个service的调用。用cyclicBarrier同样可以实现。 package cyclicbarrie...原创 2011-05-11 15:45:09 · 115 阅读 · 0 评论 -
CompleteService介绍和使用实例
当向Executor提交批处理任务时,并且希望在它们完成后获得结果,如果用FutureTask,你可以循环获取task,并用future.get()去获取结果,但是如果这个task没有完成,你就得阻塞在这里,这个实效性不高,其实在很多场合,其实你拿第一个任务结果时,此时结果并没有生成并阻塞,其实在阻塞在第一个任务时,第二个task的任务已经早就完成了,显然这种情况用future task不合适的,...原创 2011-05-11 17:31:06 · 3143 阅读 · 0 评论 -
Java并发编程基础
Java 并发编程基础1.线程的风险1.1安全风险线程不安全:Public class UnsafeSequence{ Private int value; Public int getNext(){ Retur...原创 2011-04-15 14:55:17 · 85 阅读 · 0 评论 -
Java多线程基础
Java 多线程基础... 21.线程和进程... 22.Java内存模型... 32.1 Java内存模型的基本原理... 32.2 Volatile的内存工作原理... 42.3 Synchro...原创 2011-04-13 15:52:35 · 237 阅读 · 0 评论 -
硬件同步原语(CAS)理论
在Java并发编程中,常常出现一些因为线程安全问题而需要加锁来保证同步,而在Java5之后,出现了新的并发包,它的出现使得同步效率更加高效,而所有concurrent包的理论基础都是基于硬件同步原语理论,它是基于Cpu硬件的同步,效率比软件中通过锁定(排它锁)效率高。 大多数现代处理器都包含对多处理的支持。当然这种支持包括多处理器可以共享外部设备和主内存,同时它通常还包括对指令系统的增加来...原创 2010-09-24 22:13:35 · 1158 阅读 · 0 评论 -
生产消费模型实例
“生产者-消费者-仓储”模型,包含三种角色:1.生产者2.消费者3.仓库 离开了仓储,生产者消费者模型就显得没有说服力了。 对于此模型,应该明确一下几点:1、生产者仅仅在仓储未满时候生产,仓满则停止生产。2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。3、当消费者发现仓储没产品可消费时候会通知生产者生产。4、生产者在生产出可消费产品时候,应该通知等待...2010-03-02 23:23:18 · 96 阅读 · 0 评论 -
死锁实例
下面这道题,是考死锁的,比较简单,想两个问题:1.什么时候会造成死锁2.wait和notify释放了哪个锁,因为题目中有两个锁。 import java.util.LinkedList;public class DeadLockTest { LinkedList list = new LinkedList(); public synchr...原创 2011-05-19 14:21:06 · 142 阅读 · 0 评论 -
(转)Java偏向锁实现原理(Biased Locking)
http://www.iteye.com/topic/518066 阅读本文的读者,需要对Java轻量级锁有一定的了解,知道lock record, mark word之类的名词。可以参考我的一篇博文:Java轻量级锁原理详解(Lightweight Locking)Java偏向锁(Biased Locking)是Java6引入的一项多线程优化。它通过消除资源无竞争情况...2010-03-21 22:24:35 · 101 阅读 · 0 评论 -
ThreadLocal原理(转)
http://jzhua.iteye.com/blog/517291 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。 另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过T...2010-03-24 18:06:23 · 86 阅读 · 0 评论 -
用并发包中的重入锁实现生产消费模型
传统的生产消费模型,实际上是通过一个条件来调节生产者和消费者线程的唤醒或者等待,这样做的坏处是,不该被唤醒的线程也会被唤醒,这样对多线程编程来说,会引起线程无谓切换,在Java5中的并发编程包中,有重入锁实现了多条件的锁来实现生产者线程只会唤醒消费者线程,而不会唤醒其它的生产者线程,这样就适当地减少了线程的切换开销。 源代码如下: 1.仓库 package...原创 2010-06-15 00:07:38 · 89 阅读 · 0 评论 -
并发访问的问题解决方案
目前正在做基于Red 5 的Meeting系统,我们会在Meeting server上生成一个唯一的StreamKey,用于RTMP协议中,NetStream.publish的StreamID,但是有一个问题,我们调用allocateStream的时候,如果一个会议中的多个成员并发请求这个服务时(Meeting server上生成一个唯一的StreamKey),会造成同一个meeting,使用不同...2010-07-26 18:15:24 · 176 阅读 · 0 评论 -
Java 中的Double Check Lock(转)
对于多线程编程来说,同步问题是我们需要考虑的最多的问题,同步的锁什么时候加,加在哪里都需要考虑,当然在不影响功能的情况下,同步越少越好,锁加的越迟越优是我们都必须认同的。DCL(Double Check Lock)就是为了达到这个目的。DCL简单来说就是check-lock-check-act,先检查再锁,锁之后再检查一次,最后才执行操作。这样做的目的是尽可能的推迟锁的时间。网上普遍举的一...原创 2010-07-27 21:13:11 · 322 阅读 · 0 评论 -
设计模式-组合模式
组合模式的定义:将对象组合成树的形式来表示整体和局部之间的关系,使得客户端对单个对象和组合对象的使用有了一致性。 适用场合:1.需要表示一个对象整体或者局部的关系,在具有整体和部分的层次结构中,希望通过一种方式忽略整体和部分的差异,可以一致地对待它们。2.让客户端忽略不同对象层次的变化,客户端可以针对抽象类编程,无需关心对象层次结构的细节。 对象类图:...原创 2011-05-16 15:48:35 · 116 阅读 · 0 评论