
Java 并发编程
文章平均质量分 79
张小琦
这个作者很懒,什么都没留下…
展开
-
Java 并发编程(四)并发容器
ava 5.0 提供了多种并发容器来改进同步容器的性能。 同步容器是将所有对容器的访问都串行化,以实现他们的线程安全性。代价是严重降低并发行,当多个线程竞争容器的锁时,吞吐量将严重降低。 并发容器是针对多个线程并发访问设计的。 Java 5.0 增加了 ConcurrentHashMap ,用来替代同步且基于散列的 Map ,增加了 CopyOnWriteArrayList ,用于在遍历操作为主要操作的情况下替代同步的 List 。Java 5.0 还增加了两中心的容器类型原创 2014-10-23 14:43:40 · 2608 阅读 · 2 评论 -
自己动手实现简单的线程池
为了节省系统在多线程并发情况下不断的创建新和销毁线程所带来的性能浪费,就需要引入线程池。 线程池的基本功能就是线程复用。每当系统提交一个任务时,会尝试从线程池内取出空闲线程来执行它。如果没有空闲线程,这时候再创建新的线程。任务执行完毕,线程也不会立即销毁,而是加入到线程池中以便下次复用。原创 2014-12-09 09:12:09 · 3237 阅读 · 1 评论 -
Java 并发编程(四)阻塞队列和生产者-消费者模式
阻塞队列提供了可阻塞的 put 和 take 方法,以及支持定时的 offer 和 poll 方法。如果队列已经满了,那么put方法将阻塞直到有空间可以用;如果队列为空,那么take方法将一直阻塞直到有元素可用。队列可以使有界的,也可以是无界的,无界队列永远都不会充满,因此无界队列上的put方法永远不会阻塞。一种常见的阻塞生产者-消费者模式就是线程池与工作队列的组合,在 Executor 任务执行框架中就体现了这种模式。意义:该模式能简化开发过程,因为他消除了生产者和消费者类之间的代码依赖性,此外,该模式原创 2014-12-06 20:50:24 · 3619 阅读 · 0 评论 -
Java 并发编程(四)常用同步工具类
同步工具类可以使任何一种对象,只要该对象可以根据自身的状态来协调控制线程的控制流。阻塞队列可以作为同步工具类,其他类型的同步工具类还包括:信号量(Semaphore)、栅栏(Barrier)以及闭锁(Latch)。原创 2014-12-07 18:14:16 · 3213 阅读 · 1 评论 -
SimpleDateFormat 的线程安全问题与解决方案
SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类。 它允许格式化 (date -> text)、语法分析 (text -> date)和标准化。但是 SimpleDateFormat 并不是一个线程安全的类,在多线程并发访问下会出现问题。通过以下代码进行检验,原创 2014-10-19 17:23:28 · 9441 阅读 · 2 评论 -
Java 并发编程(三)为线程安全类中添加新的原子操作
Java 类库中包含许多有用的”基础模块“类。通常,我们应该优先选择重用这些现有的类而不是创建新的类。:重用能降低开发工作量、开发风险(因为现有类都已经通过测试)以及维护成本。有时候,某个线程安全类能支持我们需要的所有操作,但更多的时候,现有的类只能支持大部分的操作,此时就需要在不破坏线程安全的情况下添加一个新的操作。原创 2014-10-19 09:33:20 · 2071 阅读 · 0 评论 -
Java 并发编程(三)设计线程安全的类-实例封闭
到目前为止,我们已经介绍了关于线程安全与同步的一些基础知识。然而,我们并不希望对每一次内存访问都进行分析以确保是线程安全的,而是希望将一些现有的线程安全组件组合为更大规模的组合为更大规模的组件或程序。之后,我们会讲一些设计线程安全类的一些基本概念,介绍一些组合模式。原创 2014-10-18 21:45:03 · 3781 阅读 · 3 评论 -
Java 并发编程(二)对象的不变性和安全的发布对象
满足同步需求的另一种方法是使用不可变对象(Immutable Object)。到目前为止,我们介绍了许多与原子性和可见性相关的问题,例如得到失效数据,丢失更新操作或光查到某个对象处于不一致的状态等等,都与多线程视图同时访问同一个可变的状态相关。如果对象的状态不会改变,那么这些问题与复杂性也就自然消失了。 如果某个对象在被创建后其状态就不能被修改,那么这个对象就被成为不可变对象。线程安全型是不可变对象的固有属性之一,他们的不变性条件是由构造函数创建的,只要他们的状态不改变,那么这些不变性条件就原创 2014-10-12 22:49:46 · 6008 阅读 · 6 评论 -
Java 并发编程(二)对象的发布逸出和线程封闭
“发布(Publish)“一个对象是指使对象能够在当前作用域之外的代码中使用。可以通过 公有静态变量,非私有方法,构造方法内隐含引用 三种方式。 如果对象构造完成之前就发布该对象,就会破坏线程安全性。当某个不应该发布的对象被发布时,这种情况就被称为逸出(Escape)。下面我们首先来看看一个对象是如何逸出的。 发布对象最简单的方法便是将对象的引用保存到一个共有的静态变量中,以便任何类和线程都能看见对象,如下面代码。原创 2014-10-12 19:41:02 · 2808 阅读 · 0 评论 -
Java 并发编程(一)浅谈线程安全
首先我们要弄清楚什么叫线程安全。 “线程安全”是指:当多个线程访问某个类时,不管运行环境采用何种调度方式或者这些线程如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。原创 2014-10-11 10:00:12 · 1859 阅读 · 0 评论 -
Java 并发编程(二)对象的可见性
在第一部分,我们介绍了如果通过同步来避免多个线程在同一时刻访问相同的数据,而这节,我们将介绍如何共享和发布对象,从而使他们能够安全的由多个线程同时访问。这两部分形成了构建线程安全类以及通过 java.util.concurrent 类库来构建并发应用程序的重要基础。原创 2014-10-12 10:49:11 · 2797 阅读 · 0 评论 -
ThreadLocal-分析-总结
ThreadLocal类在Spring,Hibernate等框架中起到了很大的作用,对于其工作原理,很多网上的文章分析的不够彻底,甚至有些误解。 首先,为了解释ThreadLocal类的工作原理,必须同时介绍与其工作甚密的其他几个类(内部类)1.ThreadLocalMap2.Thread可能有人会觉得Thread与ThreadLocal有什么关系,转载 2014-05-23 08:55:28 · 991 阅读 · 0 评论 -
Vector和List 有关线程安全和线程同步的理解
最近在学习的时候,一直很疑惑Vector和List的两个容器的区别。在网上查了好多资料,原创 2014-05-23 23:30:51 · 9278 阅读 · 1 评论 -
有关线程中断和线程阻塞
一个线程都要从运行到结束都要经过3个阶段: 1、正在运行 2、准备结束运行 3、结束运行那么怎么结束这个线程呢?可以通过下面这三个方法结束一个线程。 1、使用stop()方法强制结束线程。 2、使用thread.interrupt()方法发送中断。 3、在Thread对象中设置共享变量,通过在run方法中不断检测该变量的值来决定是否结束。原创 2014-05-24 15:49:30 · 5522 阅读 · 1 评论 -
Java 并发编程(四)同步容器类
Java 中的同步容器类包括 Vector 和 Hashtable ,二者是早起 JDK 的一部分,此外还包括在 JDK1.2 中添加的一些功能相似的类,这些同步的封装类是由 Collections.synchronizedXxx 等工厂方法创建的的。这些类实现线程安全的方法都是一样的:将他们封装起来,并对每个公有方法都进行同步,使得每次都只有一个线程能访问容器的状态。原创 2014-10-22 22:47:36 · 1483 阅读 · 0 评论 -
System.out.println 的多线程并发问题
如果println函数的参数为常量则不会出现线程并发问题,但是如果参数为表达式形式,则JVM在执行println函数的时候会分为几步来执行,从而造成并发问题。原创 2014-10-23 15:41:06 · 8210 阅读 · 0 评论 -
多线程执行框架Executor详解
为了能够更好的进行多线程编程,JDK提供了一套Executor执行框架,简化开发人员的对多线程的编程工作。其框架结构图如下:框架图比较庞大,但我们只需要关注如下几个实现:Executor接口:只有一个 execute 方法,用来接收一个可执行对象。ExecutorService接口:表示具有接收任务功能。ThreadPoolExecutor:表示一个线程池,当然原创 2014-12-13 14:49:29 · 4189 阅读 · 0 评论