Java多线程 深入理解Java多线程(3.5)- Condition用法和实现原理 Condition基本用法 Condition定义了等待/通知两种类型的方法,当前线程调用这些方法时,需要提前获取到Condition对象关联的锁。Condition对象是由Lock对象(调用Lock... 09月10日 173 评论 阅读全文
Java多线程 深入理解Java多线程(3.4)- Lock(ReentrantLock和ReentrantReadWriteLock)用法和原理 一:java.util.concurrent.locks包下常用的类与接口 (1)Lock和ReadWriteLock是两大锁的根接口,Lock代表实现类是ReentrantLock(可重入锁),Re... 09月10日 151 评论 阅读全文
Java多线程 深入理解Java多线程(3.3)- CAS(Compare and Swap)无锁算法 锁(lock)的代价 锁是用来做并发最简单的方式,当然其代价也是最高的。内核态的锁的时候需要操作系统进行一次上下文切换,加锁、释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放。... 09月10日 182 评论 阅读全文
Java多线程 深入理解Java多线程(3.2)- AQS深入理解和源码解读 1 简介 在上一篇文章中我们AbstractQueuedSynchronizer(AQS)有了初步的认识。在同步组件的实现中,AQS是核心部分,同步组件的实现者通过使用AQS提供的模板方法实现同步组件... 09月10日 177 评论 阅读全文
Java多线程 深入理解Java多线程(3.1)- AQS原理详解 1 AQS 简单介绍 AQS的全称为(AbstractQueuedSynchronizer)抽象的队列式同步器。是除了java自带的synchronized关键字之外的锁机制。这个类在java.uti... 09月10日 153 评论 阅读全文
Java多线程 深入理解Java多线程(2.3)- volatile详解和使用场景 前文讲解了Java 并发编程的三大特性:原子性,可见性和有序性。本文讲解的volatile只能够保证可见性和有序性,对于原子性还是不能保证的,只能通过锁的形式解决原子性操作。 1.volatile能保... 09月09日 110 评论 阅读全文
Java多线程 深入理解Java多线程(2.6)- synchronized原理之锁优化 1 锁的优化 从JDK5引入了现代操作系统新增加的CAS原子操作( JDK5中并没有对synchronized关键字做优化,而是体现在J.U.C中,所以在该版本concurrent包有更好的性能 ),... 09月09日 144 评论 阅读全文
Java多线程 深入理解Java多线程(2.5)- synchronized用法和实现原理详解 记得开始学习Java的时候,一遇到多线程情况就使用synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程... 09月09日 131 评论 阅读全文
Java多线程 深入理解Java多线程(2.4)- volatile底层实现原理 1. 前言 我们知道synchronized是阻塞式同步,在线程竞争激烈的情况下会升级为重量级锁。而volatile就可以说是java虚拟机提供的最轻量级的同步机制。但它同时不容易被正确理解,也至于在... 09月09日 87 评论 阅读全文
Java多线程 深入理解Java多线程(2.2)- Java并发编程的3个特性(原子性,可见性,有序性) 一、原子性 原子性:即一个或者多个操作作为一个整体,要么全部执行,要么都不执行,并且操作在执行过程中不会被线程调度机制打断;而且这种操作一旦开始,就一直运行到结束,中间不会有任何上下文切换(conte... 09月09日 71 评论 阅读全文
Java多线程 深入理解Java多线程(2.8)- 彻底理解ThreadLocal的用法和原理 synchronized这类线程同步的机制可以解决多线程并发问题,在这种解决方案下,多个线程访问到的,都是同一份变量的内容。为了防止在多线程访问的过程中,可能会出现的并发错误。不得不对多个线程的访问进... 09月09日 165 评论 阅读全文
Java多线程 深入理解Java多线程(2.7)- 死锁的原因和如何避免死锁 一、死锁发生的四个必要条件 经典的“哲学家进餐”问题很好的描述了死锁的情况。5个哲学家吃中餐,坐在一张圆桌上,有5根筷子,每个人吃饭必须用两根筷子。哲学家时而思考时而进餐。分配策略有可能导致哲学家永远... 09月09日 113 评论 阅读全文