随笔分类 -  Java-Concurrency

摘要:Java集合大致可分为Set、List和Map三种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合。Java 5之后,增加了Queue体系集合,代表一种队列集合实现。 JDK1.5版本中,加入java.uill.concurrent包,其中包含 阅读全文
posted @ 2013-09-13 15:42 那些年的事儿 阅读(3088) 评论(0) 推荐(0) 编辑
摘要:Java集合大致可分为Set、List和Map三种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合。Java 5之后,增加了Queue体系集合,代表一种队列集合实现。 JDK1.5版本中,加入java.uill.concurrent包,其中包含 阅读全文
posted @ 2013-09-13 15:23 那些年的事儿 阅读(2292) 评论(1) 推荐(0) 编辑
摘要:1. java.util.concurrent概述JDK5.0以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent包中,是专门用于多线并发编程的,充分利用了现代多处理器和多核心系统的功能以编写大规模并发应用程序。主要包含原子量、并发集合、同步器、可重入锁,并对线程池的构造提供了强力的支持。原子量,是定义了支持对单一变量执行原子操作的类。所有类都有get和set方法,工作方法和对volatile变量的读取和写入一样。并发集合,是原有集合框架的补充,为多线程并发程序提供了支持。主要有:BlockingQueue,ConcurrentMap,ConcurrentNa 阅读全文
posted @ 2013-09-12 17:43 那些年的事儿 阅读(889) 评论(0) 推荐(1) 编辑
摘要:1. 背景类java.util.concurrent.Exchanger提供了一个同步点,在这个同步点,一对线程可以交换数据。每个线程通过exchange()方法的入口提供数据给他的伙伴线程,并接收他的伙伴线程提供的数据,并返回。当在运行不对称的活动时很有用。比如说,一个线程向buffer中填充数据,另一个线程从buffer中消费数据;这些线程可以用Exchange来交换数据。这个交换对于两个线程来说都是安全的。2. 示范代码package com.clzhang.sample.thread;import java.util.*;import java.util.concurrent.Exch 阅读全文
posted @ 2013-09-12 17:24 那些年的事儿 阅读(1216) 评论(0) 推荐(0) 编辑
摘要:1. 背景CountDownLatch类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。2. 示范代码下面代码示范了如果扑克游戏一桌人都到齐了,则翻底牌:package com.clzhang.sample.thread;import java.util.*;import java.util.concurrent.Co 阅读全文
posted @ 2013-09-12 16:53 那些年的事儿 阅读(547) 评论(0) 推荐(0) 编辑
摘要:1. 背景CyclicBarrier类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。2. 示范代码下面这段代码演示了打扑克游戏,够4个人则开桌,共计开5桌:package com.clzhang.sample.thread;import java.util.concurrent.BrokenBarrierException;import java.util. 阅读全文
posted @ 2013-09-12 16:46 那些年的事儿 阅读(361) 评论(0) 推荐(0) 编辑
摘要:1. 背景类java.util.concurrent.Semaphore提供了一个计数信号量。通过Semaphore类,可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。Semaphore的构造函数中带有一个fairness的参数,用于设置是否“公平”。当fairness为true时,Semaphore保证各线程以后进先出(FIFO)的方式获得信号量。如果fairness为false,则不保证这种顺序。2. 示范代码下面这段代码演示了某种资源只限于5个线程访问:package com.clzhang.sample. 阅读全文
posted @ 2013-09-12 16:43 那些年的事儿 阅读(818) 评论(0) 推荐(0) 编辑
摘要:1. 什么是线程安全性调用一个函数(假设该函数是正确的)操作某对象常常会使该对象暂时陷入不可用的状态(通常称为不稳定状态),等到操作完全结束,该对象才会重新回到完全可用的状态。如果其他线程企图访问一个处于不可用状态的对象,该对象将不能正确响应从而产生无法预料的结果,如何避免这种情况发生是线程安全性的核心问题。一个类在可以被多个线程安全调用时就是线程安全的。类要成为线程安全的,首先必须在单线程环境中有正确的行为。正确性与线程安全性之间的关系非常类似于在描述ACID(原子性、一致性、独立性和持久性)事务时使用的一致性与独立性之间的关系:从特定线程的角度看,由不同线程所执行的对象操作是先后(虽然顺序 阅读全文
posted @ 2013-09-12 10:41 那些年的事儿 阅读(354) 评论(0) 推荐(0) 编辑
摘要:1. 基本概念程序,是一组有序的静态指令,是一种静态的概念。程序的封闭性是指程序一旦运行,其结果就只取决于程序本身;程序的再现性是指当机器在同一数据集上重复执行同一程序时,机器内部的动作系列完全相同,最后获得的结果也相同。进程,是一种活动,它是由一个动作系列组成,每个动作是在某个数据集上执行一段程序,整个活动结果是提供一处系统或用户功能。进程一般由三部分组成:程序、数据集合、进程控制块(PCB)。进程具有并发性和不确定性。线程,是一个进程内部的顺序控制流。线程本身不能独立运行,必须在进程中执行,使用进程的地址空间。一个进程内部包含多个顺序控制流,或者并发执行多种运算,就是多线程。创建进程的高消 阅读全文
posted @ 2013-09-12 09:37 那些年的事儿 阅读(484) 评论(0) 推荐(0) 编辑
摘要:1. 背景在Java5的多线程中,可以使用Callable接口来实现具有返回值的线程。使用线程池的submit方法提交Callable任务,利用submit方法返回的Future存根,调用此存根的get方法来获取整个线程池中所有任务的运行结果。方法一:如果是自己写代码,应该是自己维护一个Collection保存submit方法返回的Future存根,然后在主线程中遍历这个Collection并调用Future存根的get()方法取到线程的返回值。方法二:使用CompletionService类,它整合了Executor和BlockingQueue的功能。你可以将Callable任务提交给它去执 阅读全文
posted @ 2013-08-21 21:29 那些年的事儿 阅读(10372) 评论(0) 推荐(2) 编辑
摘要:1. 背景java.util.concurrent.atomic这个包是非常实用,解决了我们以前自己写一个同步方法来实现类似于自增长字段的问题。在Java语言中,增量操作符(++)不是原子的,也就是非线程安全的;在使用的时候,要保证数据同步,就需要使用类似于synchronized关键字等手段来保证数据正确。正因为如此,《Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)》一文中用synchronized关键字来实现一个自增长的字段。2. 实现代码如今使用java.util.concurrent.atomic包,问题简单多了。示范代码如 阅读全文
posted @ 2013-08-17 10:59 那些年的事儿 阅读(6505) 评论(0) 推荐(0) 编辑
摘要:1. ThreadPoolExecutor的一个常用的构造方法ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, RejectedExecutionHandler handler) 参数说明:-corePoolSize 线程池中所保存的核心线程数。线程池启动后默认是空的,只有任务来临时才会创建线程以处理请求。prestartAllCoreThreads方法可以在线程池启动后即启动所有核心线程以等... 阅读全文
posted @ 2013-08-16 17:08 那些年的事儿 阅读(12612) 评论(4) 推荐(1) 编辑
摘要:一:newSingleThreadExecutor创建一个单线程的线程池,以无界队列方式运行。这个线程池只有一个线程在工作(如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。)此线程池能够保证所有任务的执行顺序按照任务的提交顺序执行,同一时段只有一个任务在运行。此类型线程池特别适合于需要保证执行顺序的场合。package com.clzhang.sample.thread;import java.util.concurrent.Executors;import java.util.concurrent.ExecutorService;public class ThreadPoolT 阅读全文
posted @ 2013-08-16 11:10 那些年的事儿 阅读(3552) 评论(0) 推荐(0) 编辑
摘要:如果程序不使用synchronized关键字来保证同步,而是直接使用Lock对象来保证同步,则系统中不存在隐式的同步监视器,也就不能用wait()、notify()、notifyAll()方法进行线程通信了。当使用Lock对象来保证同步时,Java提供了Condition类来协调线程间的通信。本示范简单模拟银行帐户的存取款活动,帐户余额大于等于取款金额时允许取款;帐户余额小于1000时允许存款(这与真实业务逻辑不符合,只是技术上需要才如此做的,否则存款一下子全存完就不好玩了)。1. 实体Account类package com.clzhang.sample.thread;import java. 阅读全文
posted @ 2013-08-15 18:25 那些年的事儿 阅读(2156) 评论(0) 推荐(0) 编辑
摘要:关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象。本文探讨Lock对象。synchronized与java.util.concurrent.locks.Lock 的相同点:Lock能完成synchronized所实现的所有功能;主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放, 并且必须在finally从句中释放。一:先来一段简单的代码这段代码以前曾经用synchronized关键字实现同步( 阅读全文
posted @ 2013-08-15 11:51 那些年的事儿 阅读(6892) 评论(0) 推荐(1) 编辑
摘要:关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象。本文探讨synchronized关键字。synchronized关键字可以修饰方法,可以修饰代码块,但不能修饰构造器、属性等。对synchronized(this)的一些理解当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。当一个线程访问object的一个synchronized(this)同步代码 阅读全文
posted @ 2013-08-14 21:34 那些年的事儿 阅读(6872) 评论(0) 推荐(0) 编辑
摘要:并发性(concurrency)和并行性(parallel)是两个概念,并行是指在同一时刻,有多条指令在多个处理器上同时执行;并发指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得宏观上具有多个进程同时执行的效果。多线程编程优点:进程之间不能共享内存,但线程之间共享内存非常容易。系统创建线程所分配的资源相对创建进程而言,代价非常小。Java中实现线程的方式目前有三种:一:继承Thread类创建线程类package com.clzhang.sample.thread;// 通过继承Thread类来创建线程类public class ThreadByExtends extends 阅读全文
posted @ 2013-08-14 19:55 那些年的事儿 阅读(10001) 评论(0) 推荐(0) 编辑