唉~这一大篇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分布式应用学习笔记04JDK的并发包的集合总结
java-jdk1.8-8u361-all-jdk-win-linux 该压缩包中包含jdk1.8-8u361下windows版本和linux版本,其包含快速安装包和对应的jdk压缩包版本,具体内容如下: jdk-8u361-linux-aarch64.rpm jdk-8u361-linux-i586.rpm jdk-8...
Java分布式应用学习笔记04JDK的并发包的集合总结
三个版本的java jdk分别是:jdk-8u172-windows-x64.exe、jdk-8u251-windows-x64.exe、jdk-14.0.1_windows-x64_bin.exe
java8的64位安装包jdk-8u181-windows-x64
java JDK1.8.60-jdk-8u60-windows-x64,java JDK1.8.60-jdk-8u60-windows-x64,java JDK1.8.60-jdk-8u60-windows-x64
资源描述:jdk-8u281-windows-x64.exe是Java开发工具包(JDK)的一个版本,适用于Windows 64位操作系统。JDK是Java开发的核心工具包,包括Java编译器、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:$...
centOS的Java8的jdk文件(jdk-8u333-linux-i586.tar)
Java jdk1.8说明文档,直接下载并拷贝到jdk目下 jdk1.8 doc(jdk-8u191-docs-all)
最新版windows jdk-8u381-windows-x64.zip最新版windows jdk-8u381-windows-x64.zip最新版windows jdk-8u381-windows-x64.zip
windwos java jdk1.8 64位
最新版windows jdk-11.0.19_windows-x64_bin.zip最新版windows jdk-11.0.19_windows-x64_bin.zip
jdk8 java8 linux版 jdk-8u162-linux-x64.tar.zip
Java SE 开发工具包 8u361 JDK 是使用 Java 编程语言构建应用程序的开发环境。 JDK 包括可用于开发和测试用 Java 编程语言编写并在 Java TM平台上运行的程序的工具。 ...jdk-8u361-windows-x64.exe
官方下载链接:https://download.oracle.com/otn/java/jdk/8u251-b08/3d5a2bb8f8d4428bbe94aed7ec7ae784/jdk-8u251-windows-x64.exe 觉得慢的话可以用txt里百度网盘下载,附件为网盘地址和提取码 jdk8 jdk-8u251-...
linux环境java8安装包jdk-8u212-linux-x64,适用于linux环境java基础环境安装,适配x64系统。
jdk-8u391-windows-x64
JDK1.8 Java 官方 jdk-8u181-windows-x64.rar
arm架构下jdk-8u391-linux-aarch64.tar下安装部署java1.8