`
pengzhoushuo
  • 浏览: 12500 次
  • 性别: 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

    NULL 博文链接:https://wensiqun.iteye.com/blog/1226770

    JDK Unsafe 源码注释

    并发作为 Java 中非常重要的一部分,其内部大量使用了 Unsafe 类,它为 java.util.concurrent 包中的类提供了底层支持。

    JDK-Concurrent:深入学习JDK Concurrent包,以及其他线程相关源码;

    开始从原始二进制研究Concurrent包,以及其他并发相关的包,对于途中遇到的不明白的东西,也会作相应了解。 该项目的缘由是看CopyOnWriteArrayList二进制时,对Unsafe类一无所知,才有了好钻钻一番的冲动。 ...

    Java并发包源码分析(JDK1.8)

    Java并发包源码分析(JDK1.8):囊括了java.util.concurrent包中大部分类的源码分析,其中涉及automic包,locks包(AbstractQueuedSynchronizer、ReentrantLock、ReentrantReadWriteLock、LockSupport等),queue...

    collectionJava源码-jdk-source-code-reading:JDK源代码阅读

    collection Java 源码 概述 主要分析 JDK8 源码。 基础 java-io java-nio java-reflect java-collection java-annotation java-net java-jdbc java-concurrent java-jvm java8

    javanetty源码-java:jdk、guava、netty等源码阅读

    java netty 源码 项目由一下几个部分组成: 1.guava: guava源码demo; 2.jdk: jdk8相对于jdk7的新特性: java.util.stream ...java.util.concurrent; 3.netty: io基础,bio,nio,aio; netty服务端客户端demo;

    java8源码-java-high-concurrent-programming:《实战Java高并发程序设计》

    java-high-concurrent-programming 《实战Java高并发程序设计》源码整理,github上已经有人整理了,但是最近在看这本书,还是自己把每章代码整理下,也加深下自己的理解. 目录 第一章:走入并行世界 第二章:Java...

    java8stream源码-daydayup:天天向上

    jdk源码阅读注释 org.xpen.concurrent CLH 自旋锁,AbstractQueuedSynchronizer类研究 org.xpen.cv.opencv.FaceDetection opencv人脸识别,flandmark眼睛,鼻子,嘴检测 org.xpen.cv.tesseract tesseract文字识别 org....

    java8源码-JavaRobot:Java学习笔记,JavaLearningNote

    java8 源码 学习笔记(持续更新中) 所有文章均同步发布到微信公众号【JavaRobot】,关注微信公众号,...Concurrent源码系列 待完善 JVM(Java虚拟机) 类加载 垃圾回收算法 JavaConcurrent(Java并发系列) 【Java并发系列】

    javaapi和源码-javase_review:回顾JavaSE深入了解源代码,并实现JDKAPI。源代码分析文章可以找到@我的博客

    JDK API. the source code analyse articles can find @my blog 参考资料: 视频: 【1】. 刘意JavaSE视频--【主导】 【2】. 张龙-圣思源视频课程--【深入源码和各种设计模式】 -----------------------------------...

    java8源码-javase:Java

    源码 javase 用于练习Java基础代码。 collections 用于普通的集合的用法。 Reference的实例。 concurrent-module 代码来自Java8 in action,主要写的是异步计算CompleteableFuture用法。 还有部分同步的集合类的代码...

    Java线程池文档

    [1]中博主自己通过ThreadGroup实现一个线程池(挺方便理解的),使用的是jdk1.4版本,Jdk1.5版本以上提供了现成的线程池。 [2]中介绍了java.util.concurrent.Executors类的API。 [3]中介绍了Java中线程池的类体系...

    java8源码-SpringTree:互联网通用技术

    源码 SpringTree springboot mybatis mysql zookeeper mongodb kafka rocketmq memcached es lamda fork/join ThreadPool 微信支付 Elasticsearch 1:微信支付,暂时只支持公众号网页(调用微信客户端)支付,不支持...

    Java中LockSupport的使用.docx

    LockSupport是JDK1.6中在java.util.concurrent中的子包locks中引入的一个比较底层的工具类,用来创建锁和其他同步工具类的基本线程阻塞原语。java锁和同步器框架的核心 AQS: AbstractQueuedSynchronizer,就是通过...

    java-concurrent-programming:《实战Java高并发程序设计》笔记和二进制整理

    《实战Java高并发程序设计》笔记和源码笔记《实战Java高并发程序设计》中有很多代码范例,适合初学者通过实践入门并发编程,这本书有个问题就是前面的代码都用JDK7,第六章开始又用JDK8了笔者精心制作相关笔记并整理...

    java数据分析源码-javaModel:java高级基础知识总结,算法,数据结构,多线程,jvm优化,spring源码分析,java新特性等

    java数据分析源码 一、多线程高并发(concurrent、jvm包) 1.JUC多线程及高并发 1.1 多线程集合 1.2 cas 1.3 锁 1.4 队列 1.5 线程池 2.JVM+GC解析 demo 二、JDK8新特性(lamp包) 1.四大函数式接口 2.方法引用 3....

    java8源码-example:常见的java知识点代码示例

    在此方法出现在HashMap里面之前,JDK给出的解决方案是ConcurrentMap的putIfAbsent()方法。 出现在HashMap里面的这个putIfAbsent()方法与之前的解决方法具有相同的功能, 4.2 特点 1.当value为null的时候,put

    Java并发编程:核心理论

    在此基础上,我们会进一步分析java.util.concurrent包的工具类,包括其使用方式、实现源码及其背后的原理。本文是该系列的第一篇文章,是这系列中核心的理论部分,之后的文章都会以此为基础来分析和解释。  一、...

    Guava 16.0 API (CHM格式)

    下面我们就开启优雅Java编程学习之旅!  项目相关信息:  官方首页:http://code.google.com/p/guava-libraries  官方下载:http://code.google.com/p/guava-libraries/downloads/list  官方文档:...

    一个基于Python和Flume的日志收集和解析系统+源代码+文档说明

    该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! ...

Global site tag (gtag.js) - Google Analytics