`
suhuanzheng7784877
  • 浏览: 702342 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Ff8d036b-05a9-33b5-828a-2633bb68b7e6
读金庸故事,品程序人生
浏览量:47699
社区版块
存档分类
最新评论

Java分布式应用学习笔记04JDK的并发包的集合总结---后篇

阅读更多

唉~这一大篇blog又是只能显示部分,部分内容被截断了。。。。

 

4.  Set的并发

CopyOnWriteArraySetCopyOnWriteArrayList底层实现差不多,就是在添加元素的时候需要对对象进行唯一性判断,如果对象数组已经含有重复的元素,不进行增加处理。在此不再赘述。

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的那个乐观锁有异曲同工的意思。其他的一些原子类AtomicBooleanAtomicLong等等在此不再赘述,使用以及底层原理都差不多。

7.  总结与反思

关于并发包的集合类就先总结到这里,这次没有将集合的读取元素进行性能对比,实际应用中高并发的读取比集合元素改变(addremovereplace)更为常见,不过代码很简单,所以就不给出了,有兴趣的朋友认识了这些类后可以自己做实验。至于反思,应该就是这些并发包的资源性能,是否很占用内存空间,加入在一个高并发环境下而且硬件环境又不允许分配给应用系统十分宽容的硬件资源,那么高并发情况下是否玩不转(比如云计算的虚拟化,一台实机可能启动多个虚拟机,作为实机的扩充)。这个问题我们可以使用工具测试jconsole进行监控,也有可能用户的应用自身代码也存在着一系列的问题,还是得具体问题具体分析,总的来说并发包要想实现线程安全,而且时间效率在一般环境下又和非并发包的差不多,需要消耗的内存资源比以前多是一定的,这个是避免不了的,世界是物质的,做任何事情都需要付出代价,只是看这个代价和收益相比值不值得。

16
7
分享到:
评论
7 楼 suhuanzheng7784877 2011-08-04  
sunshine09120 写道
谢谢分享啊,lz还有没有多线程的文章啊。

恩,会分享的
6 楼 sunshine09120 2011-08-04  
谢谢分享啊,lz还有没有多线程的文章啊。
5 楼 qianjingtu1008 2011-08-03  
楼主这还不算深入?看来我可以洗洗睡了。
4 楼 suhuanzheng7784877 2011-08-03  
jiangshoujun9819 写道
值得探讨的问题,希望楼主多写好文章。学习了,顶

唉~这里写得其实并没有太深入,snake1987的意见很正确~回头看看如果时间允许,我会将并发包这专题再多总结一些,分享给大家。
3 楼 jiangshoujun9819 2011-08-03  
值得探讨的问题,希望楼主多写好文章。学习了,顶
2 楼 suhuanzheng7784877 2011-08-03  
白糖_ 写道
感觉编辑器对IE67不兼容,内容多的话点击编辑,整个编辑器就乱了

现在都只能用chrome编辑了

恩~je是有这个问题
1 楼 白糖_ 2011-08-03  
感觉编辑器对IE67不兼容,内容多的话点击编辑,整个编辑器就乱了

现在都只能用chrome编辑了

相关推荐

    java-jdk1.8-jdk-8u181-windows-x64.zip

    这个压缩包"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

    这个压缩包文件“java-jdk1.8-jdk-8u191-linux-x64.zip”包含了用于在64位Linux系统上安装和使用的JDK 1.8更新191的所有必要组件。JDK(Java Development Kit)是开发和运行Java应用程序的基础,它包括了Java编译器...

    java环境jdk8(mac版)苹果笔记本使用 jdk-8u221-macosx-x64

    本文将详细介绍如何在苹果笔记本上安装和配置Java Development Kit (JDK) 8,具体版本为`jdk-8u221-macosx-x64`。首先,我们需要理解JDK是什么以及它的作用。 JDK(Java Development Kit)是Oracle公司提供的用于...

    Java分布式应用学习笔记-谈JVM.doc

    【Java分布式应用学习笔记-谈JVM】 在Java分布式应用中,JVM(Java虚拟机)扮演着至关重要的角色。虽然有些人可能认为分布式系统与JVM的关系并不密切,但事实上,尤其是在大型分布式环境,如云计算服务平台,对Java...

    java的jdk最新版本,jdk-8u211-windows-i586_X86

    Java JDK(Java Development Kit)是Java编程语言的软件开发工具包,是开发和运行Java应用程序的基础。这个最新的版本,"jdk-8u211-windows-i586_X86",是专为32位操作系统设计的,适用于Windows平台。Oracle公司是...

    java8的64位安装包jdk-8u181-windows-x64

    Java 8是Oracle公司推出的Java开发工具包(Java Development Kit,简称JDK)的一个重要版本,对于软件开发者来说,它是构建、运行Java应用程序的基础。64位版本的JDK适用于处理大量内存和高性能计算需求的环境,因为...

    jdk-8u172-windows-x64.exe、jdk-8u251-windows-x64.exe、jdk-14.0.1_windows-x64_bin.e

    本话题涉及三个不同版本的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

    标题中的"java-jdk1.8-jdk-8u192-windows-x64.zip"表明这是一个压缩包,内含64位的Java JDK 1.8u192版本,适用于Windows操作系统。这种格式的文件通常用于方便下载和传输大文件,用户需要先将其解压缩才能进行后续...

    java-jdk1.8-jdk-8u191-windows-x64.zip

    JDK(Java Development Kit)是开发和运行Java应用程序所必需的软件集合,包括Java编译器、Java运行环境、类库以及各种工具。在这个特定的版本1.8u191中,"u191"代表的是更新版本号,意味着它是1.8主版本下的第191次...

    java-jdk1.8-jdk-8u201-windows-x64.zip

    安装JDK 1.8的过程非常简单,只需要双击下载的“jdk-8u201-windows-x64.exe”文件,然后按照安装向导的提示进行操作。通常,安装过程中会提供选择安装路径、是否设置环境变量等选项。为了确保Java环境的正确配置,...

    jdk-8u171-linux-x64.rpm/jdk-8u171-linux-x64.tar.gz

    本主题涉及两个特定于Linux平台的JDK版本:jdk-8u171-linux-x64.rpm和jdk-8u171-linux-x64.tar.gz。这两个文件分别对应于两种不同的安装方式,适应于不同类型的Linux系统需求。 首先,`jdk-8u171-linux-x64.rpm`是...

    jdk-8u271-windows-x64

    总结起来,"jdk-8u271-windows-x64"代表了Oracle官方提供的Java 8更新版,它引入了诸如Lambda表达式、默认方法和方法引用等革新,是Windows 64位系统上的开发者必备工具。这个版本的JDK包含了一系列用于开发、编译和...

    jdk-8u401-windows-x64.exe

    标题中的"jdk-8u401-windows-x64.exe"指的是Java Development Kit(JDK)的8u401版本,专为64位Windows操作系统设计。JDK是Java编程语言的核心组件,包含了编译器、调试工具、运行环境等,使开发者能够在本地环境中...

    jdk-8u331-linux-x64.tar.gz

    标题中的"jdk-8u331-linux-x64.tar.gz"是指Java Development Kit(JDK)的第8个更新版本331,为64位的Linux操作系统编译的。JDK是Java编程语言的核心组件,包含了Java编译器、Java运行环境、类库以及各种开发工具,...

    jdk-8u281-linux-x64.tar.gz.zip

    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:$...

    jdk-8u341-linux-x64.tar.gz

    Java Development Kit(JDK)是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。`jdk-8u341-linux-x64.tar.gz` 是Oracle公司发布的针对Linux 64位操作系统的JDK 8的更新版本...

    jdk-8u311-windows-x64.exe

    标题中的"jdk-8u311-windows-x64.exe"是Java Development Kit(JDK)的安装程序,适用于Windows操作系统且为64位架构。这个版本号"8u311"指的是JDK 8的第311次更新。JDK是Oracle公司提供的一个用于开发和运行Java...

    jdk-8u321-linux-aarch64.tar.gz

    Java Development Kit(JDK)是开发和运行Java应用程序的基础,它包含了Java编译器、Java运行环境以及各种Java工具。本篇文章将聚焦于JDK 8的更新版本8u321,特别关注其在Linux AArch64架构服务器上的安装与使用。 ...

Global site tag (gtag.js) - Google Analytics