唉~这一大篇blog又是只能显示部分,部分内容被截断了。。。。
4. Set的并发
CopyOnWriteArraySet和CopyOnWriteArrayList底层实现差不多,就是在添加元素的时候需要对对象进行唯一性判断,如果对象数组已经含有重复的元素,不进行增加处理。在此不再赘述。
5. Queue的并发
队列的并发类是java.util.concurrent.ArrayBlockingQueue,从类名字上大家估计就能猜出来了,底层使用的依然是数组。这个ArrayBlockingQueue是继承自原始的java.util.AbstractQueue,所以很多方法在父类里面已经有了,只是对于关键方法入队列、出队列操作加入了锁对儿机制。
入队列元素操作源码如下
public boolean offer(E e, long timeout, TimeUnit unit)
throws InterruptedException {
if (e == null) throw new NullPointerException();
long nanos = unit.toNanos(timeout);
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
for (;;) {
if (count != items.length) {
insert(e);
return true;
}
if (nanos <= 0)
return false;
try {
nanos = notFull.awaitNanos(nanos);
} catch (InterruptedException ie) {
notFull.signal(); // propagate to non-interrupted thread
throw ie;
}
}
} finally {
lock.unlock();
}
}
数组未满情况下,执行insert操作的时候,如果数组满了,则进行等待,单位是纳秒。如果超时或者被唤醒了,那么再次判断是否数组已满,如果线程被打断直接抛出异常。出队列方法和入队列差不多,不再赘述。
6. AtomicXXXX的原子类
并发包还提供了支持原子操作的Atomic系列类,我们举一个具有代表性的类——AtomicInteger类,通常我们使用计数器操作的时候,一般为了避免线程安全的问题,在方法上加锁操作。有了并发包下的原子系列类,我们直接使用即可。关键使用代码片段如下
public static int getSum() {
return sum.incrementAndGet();
}
其自增方法底层片段最关键是这么一句
if (compareAndSet(current, next))
return next;
此方法具体如下
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
unsafe.compareAndSwapInt调用了本地native方法直接与底层硬件也就是CPU打交道。大家有兴趣的话可以将sun的这段代码反编译看看。底层会比较内存上的地址上的值是否为当前值,是就next,不是则反复循环,直到找到当前值。这个和Hibernate的那个乐观锁有异曲同工的意思。其他的一些原子类AtomicBoolean、AtomicLong等等在此不再赘述,使用以及底层原理都差不多。
7. 总结与反思
关于并发包的集合类就先总结到这里,这次没有将集合的读取元素进行性能对比,实际应用中高并发的读取比集合元素改变(add、remove、replace)更为常见,不过代码很简单,所以就不给出了,有兴趣的朋友认识了这些类后可以自己做实验。至于反思,应该就是这些并发包的资源性能,是否很占用内存空间,加入在一个高并发环境下而且硬件环境又不允许分配给应用系统十分宽容的硬件资源,那么高并发情况下是否玩不转(比如云计算的虚拟化,一台实机可能启动多个虚拟机,作为实机的扩充)。这个问题我们可以使用工具测试jconsole进行监控,也有可能用户的应用自身代码也存在着一系列的问题,还是得具体问题具体分析,总的来说并发包要想实现线程安全,而且时间效率在一般环境下又和非并发包的差不多,需要消耗的内存资源比以前多是一定的,这个是避免不了的,世界是物质的,做任何事情都需要付出代价,只是看这个代价和收益相比值不值得。
分享到:
相关推荐
这个压缩包"java-jdk1.8-jdk-8u181-windows-x64.zip"内包含两个文件:一个是主安装程序“jdk-8u181-windows-x64.exe”,用于在Windows 64位系统上安装JDK 1.8的更新181版本;另一个是“使用说明.txt”,通常会提供...
这个压缩包文件“java-jdk1.8-jdk-8u191-linux-x64.zip”包含了用于在64位Linux系统上安装和使用的JDK 1.8更新191的所有必要组件。JDK(Java Development Kit)是开发和运行Java应用程序的基础,它包括了Java编译器...
本文将详细介绍如何在苹果笔记本上安装和配置Java Development Kit (JDK) 8,具体版本为`jdk-8u221-macosx-x64`。首先,我们需要理解JDK是什么以及它的作用。 JDK(Java Development Kit)是Oracle公司提供的用于...
【Java分布式应用学习笔记-谈JVM】 在Java分布式应用中,JVM(Java虚拟机)扮演着至关重要的角色。虽然有些人可能认为分布式系统与JVM的关系并不密切,但事实上,尤其是在大型分布式环境,如云计算服务平台,对Java...
Java JDK(Java Development Kit)是Java编程语言的软件开发工具包,是开发和运行Java应用程序的基础。这个最新的版本,"jdk-8u211-windows-i586_X86",是专为32位操作系统设计的,适用于Windows平台。Oracle公司是...
Java 8是Oracle公司推出的Java开发工具包(Java Development Kit,简称JDK)的一个重要版本,对于软件开发者来说,它是构建、运行Java应用程序的基础。64位版本的JDK适用于处理大量内存和高性能计算需求的环境,因为...
本话题涉及三个不同版本的JDK:jdk-8u172-windows-x64.exe、jdk-8u251-windows-x64.exe以及jdk-14.0.1_windows-x64_bin.exe,分别对应Java 8的两个更新版本和Java 14的一个版本。 首先,让我们详细了解一下Java 8。...
标题中的"java-jdk1.8-jdk-8u192-windows-x64.zip"表明这是一个压缩包,内含64位的Java JDK 1.8u192版本,适用于Windows操作系统。这种格式的文件通常用于方便下载和传输大文件,用户需要先将其解压缩才能进行后续...
JDK(Java Development Kit)是开发和运行Java应用程序所必需的软件集合,包括Java编译器、Java运行环境、类库以及各种工具。在这个特定的版本1.8u191中,"u191"代表的是更新版本号,意味着它是1.8主版本下的第191次...
安装JDK 1.8的过程非常简单,只需要双击下载的“jdk-8u201-windows-x64.exe”文件,然后按照安装向导的提示进行操作。通常,安装过程中会提供选择安装路径、是否设置环境变量等选项。为了确保Java环境的正确配置,...
本主题涉及两个特定于Linux平台的JDK版本:jdk-8u171-linux-x64.rpm和jdk-8u171-linux-x64.tar.gz。这两个文件分别对应于两种不同的安装方式,适应于不同类型的Linux系统需求。 首先,`jdk-8u171-linux-x64.rpm`是...
总结起来,"jdk-8u271-windows-x64"代表了Oracle官方提供的Java 8更新版,它引入了诸如Lambda表达式、默认方法和方法引用等革新,是Windows 64位系统上的开发者必备工具。这个版本的JDK包含了一系列用于开发、编译和...
标题中的"jdk-8u401-windows-x64.exe"指的是Java Development Kit(JDK)的8u401版本,专为64位Windows操作系统设计。JDK是Java编程语言的核心组件,包含了编译器、调试工具、运行环境等,使开发者能够在本地环境中...
标题中的"jdk-8u331-linux-x64.tar.gz"是指Java Development Kit(JDK)的第8个更新版本331,为64位的Linux操作系统编译的。JDK是Java编程语言的核心组件,包含了Java编译器、Java运行环境、类库以及各种开发工具,...
1.下载后重命名:jdk-8u281-linux-x64.tar.gz 2.解压 tar -zxvf jdk-8u281-linux-x64.tar.gz 3.配置环境变量:vim /etc/profile 最后添加: export JAVA_HOME=/opt/jdk export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$...
Java Development Kit(JDK)是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。`jdk-8u341-linux-x64.tar.gz` 是Oracle公司发布的针对Linux 64位操作系统的JDK 8的更新版本...
标题中的"jdk-8u311-windows-x64.exe"是Java Development Kit(JDK)的安装程序,适用于Windows操作系统且为64位架构。这个版本号"8u311"指的是JDK 8的第311次更新。JDK是Oracle公司提供的一个用于开发和运行Java...
Java Development Kit(JDK)是开发和运行Java应用程序的基础,它包含了Java编译器、Java运行环境以及各种Java工具。本篇文章将聚焦于JDK 8的更新版本8u321,特别关注其在Linux AArch64架构服务器上的安装与使用。 ...