摘要: AQS即队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架。 AQS使用了一个int成员变量表示同步状态。 AQS通过内置的FIFO双向队列来完成获取锁线程的排队工作 同步器包含两个节点类型的应用,一个指向头节点,一个指向尾节点,未获取到锁的线程会创建节点线程安全(compareAndSetTail)的加入队列尾部。同步队列遵... 阅读全文
posted @ 2019-01-27 22:33 robin·张 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 无锁竞争的情况下为了减少锁竞争的资源开销,引入偏向锁。 阅读全文
posted @ 2019-01-27 22:19 robin·张 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 轻量级锁所适应的场景是线程交替执行同步块的情况。 阅读全文
posted @ 2019-01-27 22:13 robin·张 阅读(149) 评论(0) 推荐(0) 编辑
摘要: Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。因此,这种依赖于操作系统Mutex Lock所实现的锁我们称之为“重量级锁”。 JD... 阅读全文
posted @ 2019-01-27 22:10 robin·张 阅读(135) 评论(0) 推荐(0) 编辑
摘要: CAS,在Java并发应用中通常指CompareAndSwap或CompareAndSet,即比较并交换。 CAS是一个原子操作,它比较一个内存位置的值并且只有相等时修改这个内存位置的值为新的值,保证了新的值总是基于最新的信息计算的,如果有其他线程在这期间修改了这个值则CAS失败。CAS返回是否成功或者内存位置原来的值用于判断是否CAS成功。 JVM中的CAS操作是利用了处理器提供的CMPXCHG... 阅读全文
posted @ 2019-01-27 22:06 robin·张 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 如果一系列的连续操作都对同一个对象反复加锁和解锁,甚至加锁操作是出现在循环体中的,那即使没有线程竞争,频繁地进行互斥同步操作也会导致不必要的性能损耗。 如果虚拟机探测到有这样一串零碎的操作都对同一个对象加锁,将会把加锁同步的范围扩展(膨胀)到整个操作序列的外部(由多次加锁编程只加锁一次)。 一种需要锁粗化的极端的情况是: for(int i=0;i<size;i++){ synchroni... 阅读全文
posted @ 2019-01-27 22:04 robin·张 阅读(628) 评论(0) 推荐(0) 编辑
摘要: 锁消除是指虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不可能存在共享数据竞争的锁进行削除。锁削除的主要判定依据来源于逃逸分析的数据支持,如果判断到一段代码中,在堆上的所有数据都不会逃逸出去被其他线程访问到,那就可以把它们当作栈上数据对待,认为它们是线程私有的,同步加锁自然就无须进行。 比如StringBuffer的append方法用了synchronized关键词,它是线程安全的... 阅读全文
posted @ 2019-01-27 22:02 robin·张 阅读(401) 评论(0) 推荐(0) 编辑
摘要: JavaSE1.6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”。 在JavaSE1.6中,锁一共有4种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,这几个状态会随着竞争情况逐渐升级。 锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。 阅读全文
posted @ 2019-01-27 21:44 robin·张 阅读(115) 评论(0) 推荐(0) 编辑
摘要: synchronized是基于Monitor来实现同步的。 Monitor 的工作机理: 线程进入同步方法中。 为了继续执行临界区代码,线程必须获取 Monitor 锁。如果获取锁成功,将成为该监视者对象的拥有者。任一时刻内,监视者对象只属于一个活动线程(The Owner) 拥有监视者对象的线程可以调用 wait() 进入等待集合(Wait Set),同时释放监视锁,进入等待状态。 其他线程调... 阅读全文
posted @ 2019-01-27 21:42 robin·张 阅读(386) 评论(0) 推荐(0) 编辑