java并发理论
xinjing_wangtao
这个作者很懒,什么都没留下…
展开
-
Java 多线程与并发编程专题
Page navigationJava 线程基础Java 多线程开发线程安全与同步并发控制非阻塞套接字(NIO)Java 5 中的并发JDK 7 中的 Fork/Join 模式相关书评Java 平台提供了一套广泛而功能强大的 API、工具和技术。其中,内建支持线程是它的一个强大的功能。这一功能为使用 Java 编程语言的程序员提供了并发编程这一诱人但转载 2016-09-10 21:28:26 · 769 阅读 · 0 评论 -
从缓存行出发理解volatile变量、伪共享False sharing、disruptor
volatile关键字当变量被某个线程A修改值之后,其它线程比如B若读取此变量的话,立刻可以看到原来线程A修改后的值 注:普通变量与volatile变量的区别是volatile的特殊规则保证了新值能立即同步到主内存,以及每次使用前可以立即从内存刷新,即一个线程修改了某个变量的值,其它线程读取的话肯定能看到新的值;普通变量:写命中:当处理器将操作数写回到一个内转载 2016-09-10 21:32:35 · 586 阅读 · 0 评论 -
Fork/Join框架之Fork、Join操作
ForkFork就是一个不断分枝的过程,在当前任务的基础上长出n多个子任务。当一个ForkJoinTask任务调用fork()方法时,当前线程会把这个任务放入到queue数组的queueTop位置,然后执行以下两句代码:[java] view plain copy print?if ((s -= queueBase) 2)转载 2016-09-11 22:22:55 · 544 阅读 · 2 评论 -
Fork/Join框架之双端队列
简介ForkJoinPool管理着ForkJoinWorkerThread线程,ForkJoinWorkerThread线程内部有一个双端队列,这个双端队列主要由一个数组queue、数组下标queueBase、数组上标queueTop三个值保证。ForkJoinTask[] queue:数组的大小必须是2的n次方,方便将取模转换为移位运算;int queueTop:标识下一转载 2016-09-11 22:23:19 · 278 阅读 · 0 评论 -
JAVA并发编程学习笔记之MCS队列锁
简介与CLH类似,MCS也是由QNode对象构成的链表,每个QNode表示一个锁持有者,表示一个线程要么已经获取锁,要么正在等待锁。它与CLH不同的是,队列是一个显示链表,是通过next指针串起来的。实现MCS队列锁的具体实现如下:1、如图(a)所示,队列初始化时没有结点,tail=null;2、如图(b)所示,线程A想要获取锁,于是将自转载 2016-09-05 16:48:12 · 333 阅读 · 0 评论 -
“J.U.C”:ReentrantReadWriteLock
ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁。ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量。在这种情况下任何的“读/读”、“读/写”、“写/写”操作都不能同时发生。然而在实际的场景中我们就会遇到这种情况:有些资源并发的访问中,它大部分时间都是执行读操作,写操作比较少,但是读操作并不影响数据的一致性,如果在进行读操作时采用独占转载 2016-09-08 17:16:02 · 255 阅读 · 0 评论 -
Tomcat学习之Context
context一个context代表一个web应用,它运行在特定的虚拟主机中,每个web应用要么是一个war文件,要么是一个符合规范的目录。一般HTTP请求路径中带有requestURI,我们可以从requestURI中获取上下文路径,根据上下文路径可以选择适合的web应用程序来处理这个请求。你还可以定义多个context,但每个context的名称必须唯一。context一般会出转载 2016-09-08 17:19:56 · 400 阅读 · 0 评论 -
Fork/join框架之ForkJoinPool
概述jdk7新增了并发框架-fork/join框架,在这种框架下,ForkJoinTask代表一个需要执行的任务,真正执行这些任务的线程是放在一个线程池(ForkJoinPool)里面。ForkJoinPool是一个可以执行ForkJoinTask的ExcuteService,与ExcuteService不同的是它采用了work-stealing模式:所有在池中的线程尝试去执行其他线程创建转载 2016-09-08 17:20:24 · 219 阅读 · 0 评论 -
JAVA并发编程学习笔记之synchronized (r)
监视器java中同步是通过监视器模型来实现的,JAVA中的监视器实际是一个代码块,这段代码块同一时刻只允许被一个线程执行。线程要想执行这段代码块的唯一方式是获得监视器。监视器有两种同步方式:互斥与协作。多线程环境下线程之间如果需要共享数据,需要解决互斥访问数据的问题,监视器可以确保监视器上的数据在同一时刻只会有一个线程在访问。什么时候需要协作?比如:一个线程向缓冲区写数据,另一个线转载 2016-09-05 16:48:59 · 313 阅读 · 0 评论 -
关于多线程编程您不知道的 5 件事 (r)
虽然很少有 Java™ 开发人员能够忽视多线程编程和支持它的 Java 平台库,更少有人有时间深入研究线程。相反地,我们临时学习线程,在需要时向我们的工具箱添加新的技巧和技术。以这种方式构建和运行适当的应用程序是可行的,但是您可以做的不止这些。理解 Java 编译器的线程处理特性和 JVM 将有助于您编写更高效、性能更好的 Java 代码。在这期的 5 件事 系列 中,我将通过同步方法、v转载 2016-09-05 16:53:17 · 417 阅读 · 0 评论 -
Java多线程讨论 (r)
第一次杭州程序员圆桌交流会于上周末在杭城著名的betacafe举行了,本次主题为Java并发编程,参加的人员为14人,分别来自网易、cisco、DBAppSecurity、阿里巴巴b2b、淘宝、支付宝、阿里云,组织者为阿里云的龙浩,twitter id为: @hoorace,交流会上共有7人分享了PPT,其他人员热烈的参与了讨论,:),总结来说,本次的交流会还是很成功的,质量不错,组织形式上后面可转载 2016-09-05 16:53:51 · 226 阅读 · 0 评论 -
ThreadLocal实现方式&使用介绍---无锁化线程封闭 (r)
http://blog.csdn.net/xieyuooo/article/details/8599266 关注哈下面的提问虽然现在可以说很多程序员会用ThreadLocal,但是我相信大多数程序员还不知道ThreadLocal,而使用ThreadLocal的程序员大多只是知道其然而不知其所以然,因此,使用ThreadLocal的程序员很多时候会被它导入到陷进中去,其转载 2016-09-05 16:54:10 · 887 阅读 · 0 评论 -
synchronized与static synchronized 的区别、synchronized在JVM底层的实现原理及Java多线程锁理解 (r)
本Blog分为如下部分:第一部分:synchronized与static synchronized 的区别第二部分:JVM底层又是如何实现synchronized的第三部分:Java多线程锁,源代码剖析第一部分:synchronized与static synchronized的区别1、synchronized与static synchronize转载 2016-09-05 16:54:26 · 1589 阅读 · 0 评论 -
详解java定时任务 (r)
在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现。下面LZ就其原理、实例以及Timer缺陷三个方面来解析java Timer定时器。一、简介 在java中一个完整定时任务需要由Timer、TimerTask两个类来配合完成。 API中是这样定义他们的,Timer:一种工具,线程用其安排以后在后转载 2016-09-05 16:54:41 · 502 阅读 · 0 评论 -
“J.U.C”:ReentrantLock之一简介 (r)
http://blog.csdn.net/chenssy/article/details/47728839注:由于要介绍ReentrantLock的东西太多了,免得各位客官看累,所以分三篇博客来阐述。本篇博客介绍ReentrantLock基本内容,后两篇博客从源码级别分别阐述ReentrantLock的lock、unlock实现机制。ReentrantLock,可重入的互斥锁,转载 2016-09-08 17:12:33 · 238 阅读 · 0 评论 -
线程基本概念 (r)
学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的“系统”,需要自己好好总结、整理才能征服它。希望同仁们一起来学习Java并发编程,共同进步,互相指导。在学习Java并发之前我们需要先理解一些基本的概念:共享、可变、线程安全性、线程同步、原子性、可见性、有序性。共享和可变要编写线程安全的代码,其核心在于对共享转载 2016-09-08 17:13:39 · 286 阅读 · 0 评论 -
synchronized (r)
在我们的实际应用当中可能经常会遇到这样一个场景:多个线程读或者、写相同的数据,访问相同的文件等等。对于这种情况如果我们不加以控制,是非常容易导致错误的。在java中,为了解决这个问题,引入临界区概念。所谓临界区是指一个访问共用资源的程序片段,而这些共用资源又无法同时被多个线程访问。在java中为了实现临界区提供了同步机制。当一个线程试图访问一个临界区时,他将使用一种同步机制来查看是不是已经转载 2016-09-08 17:14:07 · 203 阅读 · 0 评论 -
“J.U.C”:锁,lock (r)
在java中有两种方法实现锁机制,一种是在前一篇博客中(【java7并发编程实战】—–线程同步机制:synchronized)介绍的synchronized,而另一种是比synchronized更加强大和领过的Lock。Lock确保当一个线程位于代码的临界区时,另一个线程不进入临界区,相对于synchronized,Lock接口及其实现类提供了更加强大、灵活的锁机制。一个简单的锁在转载 2016-09-08 17:14:30 · 234 阅读 · 0 评论 -
“J.U.C”:ReentrantLock之二lock方法分析 (r)
前一篇博客简单介绍了ReentrantLock的定义和与synchronized的区别,下面跟随LZ的笔记来扒扒ReentrantLock的lock方法。我们知道ReentrantLock有公平锁、非公平锁之分,所以lock()我也已公平锁、非公平锁来进行阐述。首先我们来看ReentrantLock的结构【图来自Java多线程系列–“JUC锁”03之 公平锁(一)】:从上图转载 2016-09-08 17:14:47 · 303 阅读 · 0 评论 -
“J.U.C”:ReentrantLock之三unlock方法分析(r)
前篇博客LZ已经分析了ReentrantLock的lock()实现过程,我们了解到lock实现机制有公平锁和非公平锁,两者的主要区别在于公平锁要按照CLH队列等待获取锁,而非公平锁无视CLH队列直接获取锁。但是对于unlock()而已,它是不分为公平锁和非公平锁的。[java] view plain copy print?public void un转载 2016-09-08 17:15:04 · 274 阅读 · 0 评论 -
“J.U.C”:Condition (r)
在看Condition之前,我们先来看下面这个例子:工厂类,用来存放、取出商品:[java] view plain copy print?public class Depot { private int depotSize; //仓库大小 private Lock lock; //独占锁转载 2016-09-08 17:15:21 · 233 阅读 · 0 评论 -
“J.U.C”:Semaphore (r)
信号量Semaphore是一个控制访问多个共享资源的计数器,它本质上是一个“共享锁”。Java并发提供了两种加锁模式:共享锁和独占锁。前面LZ介绍的ReentrantLock就是独占锁。对于独占锁而言,它每次只能有一个线程持有,而共享锁则不同,它允许多个线程并行持有锁,并发访问共享资源。独占锁它所采用的是一种悲观的加锁策略, 对于写而言为了避免冲突独占是必须的,但是对于读就没有必转载 2016-09-08 17:15:41 · 257 阅读 · 0 评论 -
“J.U.C”:CountDownlatch (r)
上篇博文(【Java并发编程实战】—–“J.U.C”:CyclicBarrier)LZ介绍了CyclicBarrier。CyclicBarrier所描述的是“允许一组线程互相等待,直到到达某个公共屏障点,才会进行后续任务”。而CountDownlatch和它也有一点点相似之处:CountDownlatch所描述的是“在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待”。在JDK转载 2016-09-08 17:16:49 · 223 阅读 · 0 评论 -
“J.U.C”:Phaser (r)
Phaser由java7中推出,是Java SE 7中新增的一个使用同步工具,在功能上面它与CyclicBarrier、CountDownLatch有些重叠,但是它提供了更加灵活、强大的用法。CyclicBarrier,允许一组线程互相等待,直到到达某个公共屏障点。它提供的await()可以实现让所有参与者在临界点到来之前一直处于等待状态。CountDownLatch,在完成一组正转载 2016-09-08 17:17:09 · 201 阅读 · 0 评论 -
“J.U.C”:CAS操作 (r)
CAS,即Compare and Swap,中文翻译为“比较并交换”。对于JUC包中,CAS理论是实现整个java并发包的基石。从整体来看,concurrent包的实现示意图如下:i++是一个非常经典的操作,它几乎充斥着我们每个人编写的代码中。我们知道i++是可以分解的,它分解为getI()、i + 1 、setI三个步骤,所以它并不是原子操作。如果i==1,执行两次i++转载 2016-09-08 17:17:27 · 268 阅读 · 0 评论 -
“J.U.C”:CLH队列锁 (r)
在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列。他能够确保无饥饿,严格的先来先服务的公平性。下图是CLH队列节点的示意图:在CLH队列的节点QNode中包含有一个locked的字段,该字段表示该节点是否需要获取锁,为true表示需要获取,为false表示不需要获取。在CLH队列中,节点与节点之间并不是通过next指针来连接的而是转载 2016-09-08 17:17:45 · 336 阅读 · 0 评论 -
“J.U.C”:AQS分析(一)(r)
在前面博客中,LZ讲到了ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch,他们都有各自获取锁的方法,同时相对于Java的内置锁,他们具有明显的优势:花最小的空间开销创建锁、最少的时间开销获得锁、使用更加方便灵活。参考Java的内置锁,对于JUC同步器而言,他应该具备两个最基本的功能:获取锁,释放锁。其中获取锁应该是先转载 2016-09-08 17:18:12 · 352 阅读 · 0 评论 -
“J.U.C”:AQS分析(二):获取锁、释放锁 (r)
上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放。AQS锁获取AQS包含如下几个方法:acquire(int arg):以独占模式获取对象,忽略中断。acquireInterruptibly(int arg): 以独占模式获取对象,如果被中断则中止。acquireShared(int arg): 以共享模式获取对象,忽略中断。ac转载 2016-09-08 17:18:47 · 274 阅读 · 0 评论 -
AQS(三):阻塞、唤醒:LockSupport (r)
在上篇博客(【Java并发编程实战】—– AQS(二):获取锁、释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起;在释放锁后,需要唤醒该线程的继任节点lock方法,在调用acquireQueued():[java] view plain copy print?if (shouldParkAfterFa转载 2016-09-08 17:19:09 · 200 阅读 · 0 评论 -
AQS(四):CLH同步队列 (r)
在【Java并发编程实战】—–“J.U.C”:CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形。其主要从两方面进行了改造:节点的结构与节点等待机制。在结构上引入了头结点和尾节点,他们分别指向队列的头和尾,尝试获取锁、入队列、释放锁等实现都与头尾节点相关,并且每个节点都引入前驱节点和后后续节点的引用;在等待机制上由原来的自旋改成阻塞唤醒。其结构如下:知道其结构了,我们转载 2016-09-08 17:19:35 · 287 阅读 · 0 评论 -
40个Java多线程问题总结 (r)
前言Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多、越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的。这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题。这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作转载 2016-09-09 17:42:01 · 432 阅读 · 0 评论 -
理解Java中的ThreadLocal (r)
http://droidyue.com/blog/2016/03/13/learning-threadlocal-in-java/理解Java中的ThreadLocalMAR 13TH, 2016提到ThreadLocal,有些Android或者Java程序员可能有所陌生,可能会提出种种问题,它是做什么的,是不是和线程有关,怎么使用呢?等等问题,本文将总转载 2016-09-09 17:42:23 · 343 阅读 · 0 评论 -
JAVA多线程程序设计23个要点 (r)
1.多线程中有主内存和工作内存之分, 在JVM中,有一个主内存,专门负责所有线程共享数据;而每个线程都有他自己私有的工作内存, 主内存和工作内存分贝在JVM的stack区和heap区。 2.线程的状态有'Ready', 'Running', 'Sleeping', 'Blocked', 和 'Waiting'几个状态,'Ready' 表示线程正在等待CPU分配允许运行的时间。转载 2016-09-10 21:24:56 · 240 阅读 · 0 评论 -
JAVA中synchronized和lock详解 (r)
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理。 数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令转载 2016-09-10 21:27:04 · 1453 阅读 · 0 评论 -
java中的锁池和等待池 (r)
在java中,每个对象都有两个池,锁(monitor)池和等待池 wait() ,notifyAll(),notify() 三个方法都是Object类中的方法. 锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法转载 2016-09-10 21:27:45 · 589 阅读 · 0 评论 -
Java理论与实践:正确使用volatile变量 (r)
Java™语言包含两种内在的同步机制:同步块(或方法)和volatile变量。这两种机制的提出都是为了实现代码线程的安全性。其中volatile变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。在这期的Java理论与实践中,Brian Goetz将介绍几种正确使用volatile变量的模式,并针对其适用性限制提出一些建议。Java语言中的volatile变量可以被看作是一转载 2016-09-10 21:29:42 · 268 阅读 · 0 评论 -
Java 多线程 join和interrupt 方法 (r)
简述:使用Java多线程中join和interrupt函数《Java编程思想》 P669 ~ P670一个线程可以再其他线程上调用join()方法,其效果是等待一段时间直到第二个线程结束才继续执行。如果某个线程在另一个线程t上调用t.join(), 此线程将被挂起, 直到目标线程t结束才恢复(即t.isAlive() 返回为假)对join()方法转载 2016-09-10 21:30:40 · 351 阅读 · 0 评论 -
Java 多线程实现死锁场景 (r)
《Java 编程思想》 P718 ~ P722模拟死锁的场景, 三个人 三根筷子,每个人需要拿到身边的两根筷子才能开始吃饭出现死锁的场景是,三个人都拿到了右边的筷子,但是由于筷子都被抢占,均无法获得左边的筷子Chopstick.java[java] view plain copypackage转载 2016-09-10 21:31:10 · 1610 阅读 · 0 评论 -
JAVA线程池的分析和使用(r)
1. 引言合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。转载 2016-09-10 21:31:54 · 229 阅读 · 0 评论 -
为什么volatile不能保证原子性而Atomic可以?(r)
在上篇《非阻塞同步算法与CAS(Compare and Swap)无锁算法》中讲到在Java中long赋值不是原子操作,因为先写32位,再写后32位,分两步操作,而AtomicLong赋值是原子操作,为什么?为什么volatile能替代简单的锁,却不能保证原子性?这里面涉及volatile,是java中的一个我觉得这个词在Java规范中从未被解释清楚的神奇关键词,在Sun的JDK官方文档是这样形容转载 2016-09-10 21:34:15 · 366 阅读 · 0 评论