
java并发与多线程
刘嘉威
hello world
展开
-
简单总结SynchronousQueue 的特点
简单总结SynchronousQueue 的特点:1. queue有三种类型: 空类型,take以及put类型,分别说明:1.空类型时, take和put都会被阻塞, 非阻塞offer和poll都不会阻塞. 无法成功操作。2. 队列是某种类型时,同类型操作: 分两种: 1.阻塞method会阻塞,加入阻塞队列中 2.非阻塞method操作失败 。非同类型: 不管阻塞不阻原创 2016-03-03 15:56:00 · 6191 阅读 · 1 评论 -
AQS源码分析(超时、中断与其他)
中断JAVA中并没有好的中断线程的方式,早期引入的Thead.stop()和Thread.resume()容易导致死锁(参考:http://docs.oracle.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html),已经不推荐使用。JAVA线程提供了协作式中断,何为协作是中断转载 2016-03-04 09:41:57 · 1277 阅读 · 0 评论 -
AQS源码分析(共享与互斥)
共享模式与独占模式AQL的内部队列采用的是CLH队列锁模型,CLH队列是由一个一个结点(Node)构成的。Node类中有两个常量SHARE和EXCLUSIVE,顾名思义这两个常量用于表示这个结点支持共享模式还是独占模式,共享模式指的是允许多个线程获取同一个锁而且可能获取成功,独占模式指的是一个锁如果被一个线程持有,其他线程必须等待。多个线程读取一个文件可以采用共享模式,而当有一个线程在写文转载 2016-03-04 09:40:52 · 846 阅读 · 0 评论 -
AQS源码分析(获取与释放)
同步状态AQS采用的是CLH队列,CLH队列是由一个一个结点构成的,前面提到结点中有一个状态位,这个状态位与线程状态密切相关,这个状态位(waitStatus)是一个32位的整型常量,它的取值如下:[java] view plain copy print?static final int CANCELLED = 1; static转载 2016-03-04 09:39:36 · 642 阅读 · 0 评论 -
自旋锁、排队自旋锁、MCS锁、CLH锁
自旋锁(Spin lock)自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他线程占用,就一直循环检测锁是否被释放,而不是进入线程挂起或睡眠状态。自旋锁适用于锁保护的临界区很小的情况,临界区很小的话,锁占用的时间就很短。简单的实现import java.util.concurrent.atomic.AtomicReference;public class Spi转载 2016-03-04 09:32:44 · 878 阅读 · 0 评论 -
synchronized关键字
监视器java中同步是通过监视器模型来实现的,JAVA中的监视器实际是一个代码块,这段代码块同一时刻只允许被一个线程执行。线程要想执行这段代码块的唯一方式是获得监视器。监视器有两种同步方式:互斥与协作。多线程环境下线程之间如果需要共享数据,需要解决互斥访问数据的问题,监视器可以确保监视器上的数据在同一时刻只会有一个线程在访问。什么时候需要协作?比如:一个线程向缓冲区写数据,另一个线转载 2016-03-04 09:34:14 · 1055 阅读 · 0 评论 -
CLH队列锁
NUMA与SMPSMP(Symmetric Multi-Processor),即对称多处理器结构,指服务器中多个CPU对称工作,每个CPU访问内存地址所需时间相同。其主要特征是共享,包含对CPU,内存,I/O等进行共享。SMP的优点是能够保证内存一致性,缺点是这些共享的资源很可能成为性能瓶颈,随着CPU数量的增加,每个CPU都要访问相同的内存资源,可能导致内存访问冲突,可能会导致CPU资源的浪转载 2016-03-04 09:35:42 · 543 阅读 · 0 评论 -
MCS队列锁
简介与CLH类似,MCS也是由QNode对象构成的链表,每个QNode表示一个锁持有者,表示一个线程要么已经获取锁,要么正在等待锁。它与CLH不同的是,队列是一个显示链表,是通过next指针串起来的。实现MCS队列锁的具体实现如下:1、如图(a)所示,队列初始化时没有结点,tail=null;2、如图(b)所示,线程A想要获取锁,于是将自转载 2016-03-04 09:36:24 · 1442 阅读 · 0 评论 -
AQS简介
1、引言JAVA内置的锁(使用同步方法和同步块)一直以来备受关注,其优势是可以花最小的空间开销创建锁(因为每个JAVA对象或者类都可以作为锁使用)和最少的时间开销获得锁(单线程可以在最短时间内获得锁)。线程同步越来越多地被用在多处理器上,特别是在高并发的情况下,然而,JVM内置锁表现一般,而且不支持任何公平策略。从JAVA 5开始在java.util.concurrent包中引入了有别于S转载 2016-03-04 09:37:37 · 5825 阅读 · 0 评论 -
CLH锁与MCS锁的比较
1、从代码实现来看,CLH比MCS要简单得多。2、从自旋的条件来看,CLH是在前驱节点的属性上自旋,而MCS是在本地属性变量上自旋3、从链表队列来看,CLH的队列是隐式的,CLHNode并不实际持有下一个节点;MCS的队列是物理存在的。4、CLH锁释放时只需要改变自己的属性,MCS锁释放则需要改变后继节点的属性原创 2016-03-03 18:08:28 · 1578 阅读 · 0 评论 -
自己实现AtomicFloat的示例代码
import java.util.concurrent.atomic.AtomicInteger;import static java.lang.Float.*;class AtomicFloat extends Number { private AtomicInteger bits; public AtomicFloat() { this(0f);原创 2016-03-03 16:22:25 · 750 阅读 · 0 评论 -
启动线程数公式
1、启动线程数=[任务执行时间/(任务执行时间-IO等待时间)]*CPU核数(有IO阻塞)2、启动线程数3、计算密集型:线程数=cpu核数,最大限度的使用cpu计算能力,太多线程导致频繁切换上下文,反而降低性能4、io密集型:线程数>cpu核数,由于io会经常阻塞,为了提高cpu的使用度,可以增加线程数总结:最大程度的使用cpu!原创 2016-03-03 16:05:14 · 918 阅读 · 0 评论 -
JAVA CAS原理深度分析
java.util.concurrent包完全建立在CAS之上的,没有CAS就不会有此包。可见CAS的重要性。 CASCAS:Compare and Swap, 翻译成比较并交换。 java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。 本文先从CAS的应用说起,再深入原理解析。 CAS应用CAS有3个操作转载 2016-03-04 09:51:10 · 4637 阅读 · 0 评论