`
pengzhoushuo
  • 浏览: 12863 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

JDK源码研究之concurrent

阅读更多
ava.util.concurrent包中包含了Java并发编程的解决框架

1、synchronized:在JAVA中每个对象其实都有一个隐藏的锁对象,当给方法加上szhcnronized的时候相当于该对象加上同步块。比如
   public class Adder{
  public int i;
  public synchronized void add(){i++;};
   }
   其实它与
   public class Adder{
  public int i;
  Object lock = new Object();
  public void add(){
   synchronized(lock){
    i++;
   };
  };
   }是一样的道理,只不过前者用到的锁是隐藏的,如果外部也想获得该锁便无能为力了。如果还只是这样的案例那么自己定义一个Object,再用同步块的方法也能够解决问题。实际多线程编程并不如此简单,请看2

2、ReentranLock,可重入的锁,标准使用方式为
   lock.lock();
   try{...;}catch(Exception e){}finally{lock.unlock();},这个东西刚出来的时候网上就有好多人浮燥地认为ReentranLock比synchronized要高效,
   我敢保证,很多搞J2EE的都是人云亦云之辈,没有做过深入的调查的。就拿上面多线程加法运算来说吧,100万次加法的时候synchronized关键字与synchronzed同步块所需的时候非常接近。
   而ReentranLock则需要耗费较多时间,我猜应该是try{}catch块影响了效率。所以说在简单的同步代码中完全没必要用到ReentranLock,除非你确实没办法只用synchronzed解决问题,或者需要synchronzed + Object的wait()/notify()
   的时候才需要考虑引入ReentranLock。哎,现在的程序员为什么都越来越浮燥了呢,搞不懂,一有新的东西出来就一窝蜂似地跑过去追逐,跟追星族有什么两样?静下心来学基础才是最重要的。

3 volatile,这个东西呢其实也就是声明你的变量在做运算的时候只有主存中的那一份。只有一份东西了,多个线程对它做操作肯定是安全的了吧?错!虽然东西只有一份,但它只对原子操作才安全。例如

  valatile i;
  public void add(){
   int i++;
  }
  上面是典型的错误代码,因为i++是一个compareAndSwap操作,先比较再赋值,有可能这个线程在比较完的时候另外一个线程刚好做了赋值操作,而当前线程又做赋值操作的时候用的还是老的值,结果造成丢1。

  而对于形如 public void setI(int i){this.i = i;} 这样的操作是安全的。

4、atomic包,提供了原子更新字段的若干类,AtomicBoolean、AtomicInteger、AtomicLong分别是原子更新boolean integer和long的三个类,而AtomicIntegerArray和AtomicLongArray分别是用来原子更新integer[]和long[]的。AtomicIntegerFieldUpdate和AtomicLongFieldUpdate分别是用反射的方式来更新
   一个对象里面的volatile的int和long字段的。AtomicReference这个类比较经常关键,是用来原子更新引用的。其实原子更新是基于Compare And Swap(CAS)来完成的。每个类的内部其实也是通过调用sun.misc.Unsafe的comapreAndSet来实现的。

5、locks包。还看不太懂AbstractQueuedSynchronizer和具体机制,只知道是将线程维护在一个双向队列里,然后根据外部的acquire或release来锁定或释放。Lock ReadWriteLock ReteenLock 及Condition是Dong Lea提供给我们使用的现成的东东。
   Condition属于Lock,这样就可以通过condition的await或signal来阻塞线程,这事要换做以前得用synchronized + Object的基础wait/notify才能搞定。


6、ArrayBlockingQueue,一个指定大小的可阻塞队列。BlockingDeque是双向的可阻塞队列。

7、ConcurrentHashMap。这东西说白了就是把分段存储,基于段的锁定,在写操作的时候不同段之间便无需同步。在读操作的时候不上锁读,当元素为空时(刚好有读线程在进行设置操作)再上锁读。效率相当高。

8、至于CopyOnWrite的东东只建议在极少写操作的时候才使用它,特别是在元素多的时候copy是相当耗时的。

....
分享到:
评论

相关推荐

    JDK concurrent

    综上所述,JDK concurrent是一个涵盖广泛的主题,包括但不限于理解Java并发API的使用、源码分析、并发设计模式、监控和调试工具的运用。通过深入研究这个主题,开发者可以构建出更加稳定、高效和可扩展的并发应用...

    jdk1.6 源码jdk1.6 源码

    通过研究JDK 1.6的源码,开发者不仅可以深化对Java语言的理解,还能提升在特定领域如并发、网络、I/O等方面的专业技能。同时,这也有助于适应不断发展的Java技术,因为许多基础原理在新版本中仍然适用。

    JDK源码,整合所有内容

    **JDK源码详解** JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的软件开发工具包,其中包含了Java运行环境、编译器、类库以及各种工具。JDK1.8版本是Java历史上的一个重要里程碑,引入了许多...

    JDK11源码 jdk-11.0.4 src源码

    在Java编程领域,深入理解JDK源码是提升技术能力的重要途径。JDK11作为Java开发工具包的一个重要版本,引入了许多新特性和改进,为开发者提供了更高效、更安全的编程环境。本文将基于提供的jdk-11.0.4-src源码,对...

    JDK源码包(包含sun包下的源码)

    本压缩包提供的JDK源码包含了`sun`包,这意味着你可以研究诸如`sun.nio`(非阻塞I/O)、`sun.jdbc`(数据库连接)和`sun.security`(安全相关)等重要组件的实现细节。这些源码对于JDK的深度学习和性能优化有着极大...

    JDK源码选读

    《JDK源码选读》是一本专注于Java开发人员深入理解JDK内核的重要参考资料。通过对JDK源码的解析,读者可以了解到Java语言的核心机制,提升编程技能和解决问题的能力。这里我们将围绕JDK源码中的关键知识点进行深入...

    jdk源码的另一部分

    通过研究JDK源码,我们可以了解到Java的内部工作机制,这对于优化代码性能、解决复杂问题、编写高效算法都大有裨益。深入学习这些源码,将使你成为一个更资深的Java开发者,并能更好地理解和利用这个强大的平台。

    openjdk8u60+jvm jdk源码+jvm源码

    通过研究 OpenJDK 8u60 的源码,开发者可以深入理解 Java 虚拟机的工作原理,这对于优化代码、调试问题、设计高效算法以及开发新的 JVM 功能都有极大的帮助。同时,这也为学习其他编程语言的虚拟机提供了参考,因为...

    jdk源码学习

    源码学习是提升编程技能的重要途径,通过深入理解JDK源码,我们可以洞察Java语言的内部机制,掌握其设计思想,并学习到优秀的编程实践。 在JDK源码中,有许多关键的组件和类库,如: 1. **虚拟机(JVM)**:Java...

    jdk源码阅读.zip

    阅读JDK源码是提升JAVA技术的关键步骤,因为它揭示了Java平台的基础构造和设计理念。JDK1.8源码包含了众多重要的API,如IO框架、集合框架和并发框架等,这些都是Java开发者日常工作中不可或缺的部分。下面,我们将...

    jdk1.8 sun源码

    这个"jdk1.8 sun源码"压缩包很可能包含了这些未公开的Sun Microsystems的源代码,使得开发者有机会深入研究Java平台的内部工作原理,这对于进行底层优化、理解和调试Java程序有着极大的帮助。然而,值得注意的是,...

    JDK7底层C++源码及hotspot虚拟机源码

    总的来说,深入研究JDK7的C++源码和HotSpot虚拟机源码,不仅能够提高对Java语言的理解,还能让我们掌握JVM优化的技巧,从而在实际项目中编写出更高效、更稳定的代码。对于任何希望提升自身技术能力的Java开发者来说...

    jdk源码方法注释及实现

    总的来说,深入研究JDK源码可以帮助我们更好地理解Java的底层机制,提高编程效率,解决复杂问题,并有助于开发出更健壮、高效的代码。同时,这也有助于遵循最佳实践,编写出更符合Java语言特性的软件。

    java源码之jdk源码

    Java源码是深入理解Java平台工作原理的关键,JDK源码包含了Java开发工具集的核心实现。通过对JDK源码的学习,开发者可以了解到Java语言的底层机制,提升编程技能,更好地解决实际问题。以下将详细探讨Java源代码和...

    jdk1.6源码

    通过研究`java.lang.ref`和`java.lang.instrument`等包的源码,可以深入了解如何进行对象引用处理和内存监控,这对于优化Java应用的性能和避免内存泄漏至关重要。 5. **多线程与并发** `java.util.concurrent`包在...

    JDK Unsafe 源码注释

    虽然Oracle发行的JDK版本不包含Unsafe的源代码,但在并发编程中,Unsafe类为java.util.concurrent包里的类提供了底层支持,例如通过提供绕过JVM直接修改内存的能力和使用硬件CPU指令实现CAS(Compare-And-Swap)原子...

    jdk源码和jdk7开发帮助文档(api)

    对于想要提升技术水平、进行底层优化或参与开源项目的人来说,研究JDK源码是不可或缺的环节。 **JDK 7 新特性** 1. **Try-with-resources**:这个特性使得资源管理更加便捷,自动关闭在try语句块中打开的资源,如...

    jdk1.7 jdk1.8源码包

    在本资源中,我们有两个版本的JDK源码,即JDK 1.7和JDK 1.8,它们对于理解Java语言的内部工作原理以及进行高级开发和优化至关重要。 JDK 1.7,也被称为Java 7,是Oracle公司在2011年发布的。这个版本引入了一些重要...

    JDK1.6源码

    深入研究JDK 1.6的源码对于理解Java语言的工作原理、优化代码以及学习面向对象编程设计原则具有重要意义。 1. **类加载机制** JDK 1.6中的类加载器包括Bootstrap ClassLoader、Extension ClassLoader和...

    JDK源码 src

    同时,JDK源码中的并发编程组件,如`java.util.concurrent`包下的`ExecutorService`和`Future`接口,展示了Java如何处理多线程任务。源码分析能让我们掌握线程池的创建、管理和任务调度,从而在编写并发程序时更加...

Global site tag (gtag.js) - Google Analytics