假设一个应用场景:需要模拟车辆一天的运行轨迹,并且实时监控,就需要不断的像已有的数据集合中添加新的数据,并且遍历集合。
在传统的java集合包中的集合中像 ArrayList HashMap等;在同一线程中传统集合是不允许修改的,也就是遍历时不能修改,添加,删除等操作。多个线程就更不行了。
为此java.util.concurrent包中提出了一些解决方法:
使用Collections.synchronizedList() ,new CopyOnWriteArrayList<String>() 等,将集合包装为安全的集合,这样确实是结局了同步的问题。其内部的原理,就是将资源synchronized ,本身没有解决问题,因为ArrayList本身是不支持并发的,这样只会当多个线程都在争用这个资源的时候,效率就会急剧下降。
jdk 1.7 提出了java.util.concurrent.ConcurrentLinkedDeque 非阻塞的线程安全列表
ConcurrentLinkedDeque 是线程安全的,插入,删除和其它的操作可以同时执行,但是不允许插入空值。
注意:如果在进行添加和删除操作的同时也在执行迭代操作,那么此时将不会返回正确的值。
ConcurrentLinkedDeque的主要方法:
add() and offer(): 因为ConcurrentLinkedDeque是线程安全的集合,所有add方法总是返回true,和add一样offer方法也是添加一个元素,总是返回true。
poll() : 获取队列中的第一个元素并同时删除元素,如果没有获取到,返回null(此时并没有)
peek(): 和poll() 一样,不同的是,peek()不会移除元素。
element():和poll()一样,不同的是,element()在没找到时候会抛出NoSuchElementException异常。
简单的示例:
public class ConcurrentLinkedDequeDemo {
static ConcurrentLinkedDeque<String> cld = new ConcurrentLinkedDeque<String>();
public static void main(String[] args) {
//新建一个线程池
ExecutorService exService = Executors.newFixedThreadPool(2);
ThreadOne elementAdd = new ConcurrentLinkedDequeDemo().new ThreadOne();
ThreadTwo elementGet = new ConcurrentLinkedDequeDemo().new ThreadTwo();
//在主线程上执行 add 和 get 线程
exService.execute(elementAdd);
exService.execute(elementGet);
exService.shutdown();
}
class ThreadOne implements Runnable {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
cld.add("A" + i);
System.out.println("Element added is: A" +i );
}
}
}
class ThreadTwo implements Runnable {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
// String s = cld.poll();
String s = cld.peek ();
// String s = cld.element ();
System.out.println("Element received is: " + s);
}
}
}
}
执行结果:
poll():
Element received is: null
Element added is: A0
Element received is: A0
Element added is: A1
Element received is: A1
Element added is: A2
Element received is: A2
Element added is: A3
Element received is: A3
Element added is: A4
peek():
Element received is: null
Element added is: A0
Element received is: A0
Element added is: A1
Element received is: A0
Element added is: A2
Element received is: A0
Element received is: A0
Element added is: A3
Element added is: A4
element():
Element added is: A0
Element added is: A1
Element added is: A2
Element added is: A3
Element added is: A4
Exception in thread "pool-1-thread-2" java.util.NoSuchElementException
at java.util.concurrent.ConcurrentLinkedDeque.screenNullResult(ConcurrentLinkedDeque.java:812)
at java.util.concurrent.ConcurrentLinkedDeque.getFirst(ConcurrentLinkedDeque.java:956)
at java.util.concurrent.ConcurrentLinkedDeque.element(ConcurrentLinkedDeque.java:1030)
at com.dx.java.jdk.ConcurrentLinkedDequeDemo$ThreadTwo.run(ConcurrentLinkedDequeDemo.java:41)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
分享到:
相关推荐
jdk1.7_linux Linux版零积分jdk1.7_linux Linux版零积分免费下载jdk1.7_linux Linux版零积分免费下载jdk1.7_linux Linux版零积分免费下载jdk1.7_linux Linux版零积分免费下载jdk1.7_linux Linux版零积分免费下载jdk...
**JDK 1.7详解** Java Development Kit(JDK)是Oracle公司提供的用于开发和运行Java应用程序的软件工具包。JDK 1.7,也称为Java SE 7(Java Standard Edition 7),是Java语言的一个重要版本,它包含了编译器、...
JDK1.7,也被称为Java SE 7(Java Standard Edition 7),是Oracle公司在2011年发布的一个重要版本,引入了许多新特性和改进。在此,我们将深入探讨JDK1.7的一些关键知识点。 1. **动态类型**:JDK1.7引入了` ...
Java JDK 1.7,全称为Java Development Kit 1.7,是Oracle公司推出的用于开发Java应用程序的重要工具集。这个版本在Java发展历程中扮演着重要角色,提供了许多新特性和性能优化,旨在提升开发效率和程序性能。下面将...
JDK 1.7,也被称为Java SE 7(Java Standard Edition 7),是Oracle公司发布的一个重要版本,包含了对语言特性和API的诸多改进和增强。这个"免安装"版本意味着它不需要传统的安装过程,用户可以直接解压并配置环境...
**JDK 1.7免安装版详解** Java Development Kit(JDK)是Oracle公司提供的用于开发和运行Java应用程序的工具集。JDK 1.7,也被称为Java SE 7,是Java语言的一个重要版本,它在Java SE 6的基础上引入了多项新特性和...
Java JDK 1.7,全称为Java Development Kit version 7,是Oracle公司推出的Java编程语言的开发工具包,主要用于编写、编译、测试和运行Java应用程序。这个版本的JDK在2012年发布,引入了许多新特性,提升了性能,并...
标题"jdk1.7正式版64位下载"指的是这个资源是针对64位操作系统的JDK 1.7的官方稳定版本。64位操作系统能够处理更大的内存地址空间,因此对于需要处理大量数据或者运行大型应用的开发者来说,64位JDK是一个必要的选择...
在给定的标题“jdk1.7 jdk1.7 jdk1.7”中,反复提及的“1.7”指的是Java的第七个主要版本,也被称为Java 7。这个版本在2011年发布,为开发者带来了许多新特性和改进,旨在提高开发效率和程序性能。 **一、JDK 1.7的...
压缩包中的`jdk1.7.exe`是JDK 1.7的安装程序。通常,安装步骤包括以下几步: 1. 下载并运行`jdk1.7.exe`。 2. 遵循安装向导的提示,选择安装目录。 3. 在环境变量中配置`JAVA_HOME`指向JDK的安装路径。 4. 添加`%...
标题 "springboot+mybatis+jdk1.7" 指的是一个基于Spring Boot、MyBatis框架,并使用Java Development Kit 1.7版本构建的Web应用项目。这个项目已经搭建完成,具备基本的结构,方便开发者快速启动一个新的Java Web...
jdk 1.7 64位jdk 1.7 64位jdk 1.7 64位jdk 1.7 64位jdk 1.7 64位jdk 1.7 6
### jdk1.7_64免安装版本百度云下载 #### JDK 1.7 (Java Development Kit) 概述 JDK(Java Development Kit),即Java开发工具包,是Sun Microsystems(已被Oracle公司收购)针对Java语言开发的一款功能强大的软件...
标题"jdk1.7 linux64位下载"明确指出我们要讨论的是JDK 1.7在64位Linux环境下的安装和使用。 JDK 1.7,也被称为Java 7,是Oracle公司发布的一个重要版本,于2011年发布,包含了多项重要的新特性与改进。其中一些...
Java JDK 1.7源码包是用于在CentOS 7操作系统上进行OpenJDK 1.8编译的重要资源。这个源码包包含了Java Development Kit的1.7版本,通常被称为JDK 7,它是Oracle公司发布的Java编程语言和Java平台标准版的一个实现。...
"jdk1.7-linux" 指的是Oracle公司发布的针对Linux操作系统的JDK 1.7版本,也称为Java 7。这个版本在2011年发布,引入了许多新特性,对Java生态系统产生了深远影响。 **1. JDK 1.7的主要特性:** - **钻石操作符**:...
JDK 1.7,也被称为Java SE 7(Java Standard Edition 7),是Java编程语言的一个重要版本,发布于2011年。在Windows 64位操作系统上安装JDK 1.7,开发者可以获得全面的Java开发和运行环境。 **1. JDK的组成部分** ...
JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的软件工具包,而JDK1.7则是Java平台标准版(Java SE)的一个重要版本。这个标题提到的是一个“绿色版本”的JDK1.7,这意味着它是一个...
在这个场景中,我们讨论的是JDK 1.7的64位免安装版本,这使得用户无需经历传统安装过程就可以使用Java开发环境。 首先,JDK 1.7,也称为Java 7,是Oracle公司在2011年发布的Java平台标准版(Java SE)的一个重要...