我们在并发编程创建线程时,常常是创建一些Runnable对象,然后创建对应的Thread对象执行它们,但是如果程序需要并发执行大量的任务时,需要为每个任务都创建一个Thread,进行管理,这将会影响程序的执行效率,并且创建线程过多将会使系统负载过重。Java 5之后通过了一套Executor框架能够解决这些问题,能够分解任务的创建和执行过程。该框架包括Executor,ExecutorService,Callable等基础接口和Executors,ThreadPoolExecutor等实...
所用到的并发编程库import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock;package com.league.idgenerate;/*** * ID生成器接口, 用于生成全局唯一的ID流水号* * @author Ivan.Ma*/ public interface IdGenerator {/*** 生成下一个不重复的流水号* @return*/String next();} package com.league.idgenerate;/*** ID生成器的配置接口* @author Ivan.Ma*/ public interface ...
控制线程中断的方法一般常规是定义一个布尔值,然后while(布尔值) 去执行,当想停止该线程时候,把布尔值设为false.这里我们来看第二种,Interrupt 该例子模拟一个线程从1打印到10,然后到5的时候中断线程,主要在线程中捕捉InterruptedException 异常 publicclass Test implements Runnable {@Overridepublicvoid run() {// TODO Auto-generated method stubfor(int i=0;i<10;i++){System.out.println("打印"+i);try {TimeUnit...
引用:http://www.cnblogs.com/dolphin0520/ 想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。 以下是本文目录大纲: 一.对ThreadLocal的理解 二.深入解析ThreadLocal类 三.ThreadLocal的应用场景 若有不正之处请多多谅解,并欢迎...
什么是线程安全? 线程安全是指的是某个函数、函数库在并发环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。 这里有几个要点:并发、多线程、共享变量 并发 并发与并行的关系 这里我采用形象的术语来描述,尽量让非本专业的人也能理解并发是两个队伍交替使用一个机器,同一时刻只有某个队伍的某一个人可以使用,下一刻有可能是A队伍的人在使用,也有可能是B队伍的人在使用(看运气或者谁优先)。并...
线程不安全的HashMap因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。效率低下的HashTable容器HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访问HashTable的同步方法时,其他线程访问HashTable的同步方法时,可能会进入阻塞或轮询状态。如线程1使用put进行添加元素,线程2不但不能使用put方法...
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17228213 notify通知的遗漏很容易理解,即threadA还没开始wait的时候,threadB已经notify了,这样,threadB通知是没有任何响应的,当threadB退出synchronized代码块后,threadA再开始wait,便会一直阻塞等待,直到被别的线程打断。 遗漏通知的代码 下面给出一段代码演示通知是如何遗漏的,如下:[java] view plaincopypublic class MissedNotify extends Obj...
1. Semaphore 信号量是一种计数器,用来保护一个或者多个共享资源的访问。如果线程要访问一个共享资源,必须先获得信号量。若内部计数器大于0,则减1,若等于0,则线程进入休眠直至计数器大于等于0。Semaphore semaphore1 = new Semaphore(1); // 值为1的信号量 Semaphore semaphore2 = new Semaphore(1, true); // 公平模式,FIFO semaphore1.acquire(); // 获取资源,否则阻塞,且在阻塞过程中可以被中断 semaphore1.acquireU...
CompletionService简介CompletionService与ExecutorService类似都可以用来执行线程池的任务,ExecutorService继承了Executor接口,而CompletionService则是一个接口,那么为什么CompletionService不直接继承Executor接口呢?主要是Executor的特性决定的,Executor框架不能完全保证任务执行的异步性,那就是如果需要实现任务(task)的异步性,只要为每个task创建一个线程就实现了任务的异步性。代码往往包含new Thread(task).start...
在java中为我们提供了一个同步的辅助类CountDownLatch,这个类用来干什么呢?下面来学习一下。 CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它运行一个或多个线程处于等待的操作。 用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数...
《java7并发编程实战》650) this.width=650;" src="/upload/getfiles/default/2022/11/14/20221114121534262.jpg" title="QQ截图20150407000932.jpg" />原文:http://7385573.blog.51cto.com/7375573/1629399
Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的...
Java并发编程:volatile关键字解析 (点击链接原文) volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一...
java并发包中的并发List5.1CopeOnWriteArrayList 并发包中的并发List只有CopyOnWriteArrayList,该类是一个线程安全的arraylist,对其进行的修改操作都是在底层的一个复制数组上进行的,也就是使用了写时复制策略。 该类的结构:publicclass CopyOnWriteArrayList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable {privatestaticfinallong serialVersionUID = 8673264195747942595L;// 可重入的独占锁...
Java多线程干货系列(1):Java多线程基础http://www.importnew.com/21136.html#comment-65114640个Java多线程问题总结http://www.importnew.com/18459.html#comment-651217Java线程面试题 Top 50http://www.importnew.com/12773.htmlJava并发编程:Thread类的使用http://www.cnblogs.com/dolphin0520/p/3920357.htmlJava并发编程:synchronizedhttp://www.cnblogs.com/dolphin0520/p/3923737.htmlJava并发编程:Lockhttp://www.cn...