并发
文章平均质量分 95
gaozhangl
这个作者很懒,什么都没留下…
展开
-
synchronized
synchronized都知道他是同步锁,很多框架里面 都能看到 synchronized用法: 修饰方法或者 同步代码块 这两种 synchronized修饰方法的时候加的锁是当前这个类的对象锁, synchronized(this){} 也是当前对象锁 static synchronized 是当前cla...原创 2014-05-27 15:30:50 · 85 阅读 · 0 评论 -
深入JVM锁机制1-synchronized
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理。 数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU...原创 2014-06-11 18:53:44 · 109 阅读 · 0 评论 -
深入JVM锁机制2-Lock
前文(深入JVM锁机制-synchronized)分析了JVM中的synchronized实现,本文继续分析JVM中的另一种锁Lock的实现。与synchronized不同的是,Lock完全用Java写成,在java这个层面是无关JVM实现的。在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadWriteLock(实...原创 2014-06-11 18:53:32 · 121 阅读 · 0 评论 -
JAVA并发编程学习笔记之ReentrantLock
ReentrantLock是一个可重入的互斥锁,ReentrantLock由最近成功获取锁,还没有释放的线程所拥有,当锁被另一个线程拥有时,调用lock的线程可以成功获取锁。如果锁已经被当前线程拥有,当前线程会立即返回。此类的构造方法提供一个可选的公平参数 [html] view plaincopyprint?public ReentrantLock(...原创 2014-06-11 18:53:18 · 93 阅读 · 0 评论 -
JUC 源码分析 三 AbstractQueuedSynchronizer 共享模式 与 CountDownLatch
共享模式共享模式允许一组线程获取同一个许可。为实现共享模式子类需要实现两个方法:tryAcquireShared:返回int类型的值,小于0表示获取失败,等于0表示获取成功但不允许后续更多的获取,大于0表示获取成功且允许更多的后续获取。tryReleaseShared:返回true表示释放许可成功,可以唤醒等待线程;false表示失败,不唤醒等待线程。共享获取 acqu...原创 2014-06-06 10:30:16 · 115 阅读 · 0 评论 -
JUC 源码分析 一 AbstractQueuedSynchronizer
队列结点Node类型的waitStatus、prev、next 字段都用volatile 修饰,这样直接的读写操作就具有内存可视性。表示Node状态的waitStatus字段是个int类型,这样通过数值比较就可以判断Node的状态,而不需要很多的分支语句。它的构造函数也是比较有意思的,有三个,分别用于构建同步队列的初始头结点或共享标识、构造同步队列的有效结点、构造条件队列的结点。也就是说...原创 2014-06-06 10:28:27 · 107 阅读 · 0 评论 -
ReentrantLock源码之二unlock方法解析(锁的释放)
1.ReentrantLock.unlock()分析(1)首先尝试释放锁,如果要求释放数等于锁状态数,那么将锁状态位清0,清除锁所有者,返回true;否则返回false;(2)如果(1)返回的是true,说明锁完全释放。接下来将检查等待队列,并选择一个waitStatus处于等待状态的节点下的线程unpark(恢复),选择的依据是从尾节点开始,选取最靠近头节点的等待节点,同时清理队列中线程被...原创 2014-06-06 10:04:45 · 222 阅读 · 0 评论 -
ReentrantLock源码之一lock方法解析(锁的获取)
一、前言 ReentrantLock是JDK1.5引入的,它拥有与synchronized相同的并发性和内存语义,并提供了超出synchonized的其他高级功能(例如,中断锁等候、条件变量等),并且使用ReentrantLock比synchronized能获得更好的可伸缩性。 ReentrantLock的实现基于AQS(AbstractQueuedSynchronizer)和L...原创 2014-06-06 10:04:06 · 236 阅读 · 0 评论 -
JAVA并发编程学习笔记之CAS操作
CAS操作CAS是单词compare and set的缩写,意思是指在set之前先比较该值有没有变化,只有在没变的情况下才对其赋值。我们常常做这样的操作 [java] view plaincopyprint?if(a==b) { a++; } 试想一下如果在做a++之前a的值被改变了怎么办?a++还执行吗?出现该问...原创 2014-06-05 16:32:29 · 88 阅读 · 0 评论 -
JAVA并发编程学习笔记之AQS源码分析(超时、中断与其他)
(非原创)中断JAVA中并没有好的中断线程的方式,早期引入的Thead.stop()和Thread.resume()容易导致死锁(参考:http://docs.oracle.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html),已经不推荐使用。JAVA线程提供了协作式中断,何为协...原创 2014-06-05 16:32:00 · 109 阅读 · 0 评论 -
JAVA并发编程学习笔记之AQS源码分析(共享与互斥)
共享模式与独占模式(非原创)AQS的内部队列采用的是CLH队列锁模型,CLH队列是由一个一个结点(Node)构成的。Node类中有两个常量SHARE和EXCLUSIVE,顾名思义这两个常量用于表示这个结点支持共享模式还是独占模式,共享模式指的是允许多个线程获取同一个锁而且可能获取成功,独占模式指的是一个锁如果被一个线程持有,其他线程必须等待。多个线程读取一个文件可以采用共享模式,而当有一个线...原创 2014-06-05 16:23:32 · 118 阅读 · 0 评论 -
JAVA并发编程学习笔记之AQS源码分析(获取与释放)
同步状态AQS采用的是CLH队列,CLH队列是由一个一个结点构成的,前面提到结点中有一个状态位,这个状态位与线程状态密切相关,这个状态位(waitStatus)是一个32位的整型常量,它的取值如下: [java] view plaincopyprint?static final int CANCELLED = 1; static final int...原创 2014-06-05 16:13:17 · 126 阅读 · 0 评论 -
JAVA并发编程学习笔记之AQS简介
1、引言JAVA内置的锁(使用同步方法和同步块)一直以来备受关注,其优势是可以花最小的空间开销创建锁(因为每个JAVA对象或者类都可以作为锁使用)和最少的时间开销获得锁(单线程可以在最短时间内获得锁)。线程同步越来越多地被用在多处理器上,特别是在高并发的情况下,然而,JVM内置锁表现一般,而且不支持任何公平策略。从JAVA 5开始在java.util.concurrent包中引入了有别于Sy...原创 2014-06-05 15:18:19 · 100 阅读 · 0 评论 -
JAVA并发编程学习笔记之CLH队列锁
(非原创)NUMA与SMPSMP(Symmetric Multi-Processor),即对称多处理器结构,指服务器中多个CPU对称工作,每个CPU访问内存地址所需时间相同。其主要特征是共享,包含对CPU,内存,I/O等进行共享。SMP的优点是能够保证内存一致性,缺点是这些共享的资源很可能成为性能瓶颈,随着CPU数量的增加,每个CPU都要访问相同的内存资源,可能导致内存访问冲突,可能会导...原创 2014-06-04 10:38:38 · 146 阅读 · 0 评论 -
Java多线程总结之由synchronized说开去
----(非原创 感觉还可以。)更新完毕,结贴,以后有新的想法再开新帖 这几天不断添加新内容,给个大概的提纲吧,方面朋友们阅读,各部分是用分割线隔开了的: synchronized与wait()/notify()JMM与synchronizedThreadLocal与synchronizedReentrantLock与synchronized最重要一条: sy...原创 2014-06-11 18:54:07 · 129 阅读 · 0 评论