随笔分类 - 并发
摘要:之前的时候看《并发编程的艺术》,书中提到dcl写法的单例模式是有问题的,有可能会导致调用者得到一个创建了一半的对象,从而导致报错。修复办法是将单例对象的引用添加volatile进行修饰,禁用重排序,则外界获取的就一定是已经创建好的对象了。 光说总是不行的,上代码: public class Sing
阅读全文
摘要:常说的单例有懒汉跟饿汉两种写法。饿汉由于类加载的时候就创建了对象,因此不存在并发拿到不同对象的问题,但会由于开始就加载了对象,可能会造成一些启动缓慢等性能问题;而懒汉虽然避免了这个问题,但普通的写法会在高并发环境下创建多个对象,单纯加synchronize又会明显降低并发效率,较好的两种写法是静态内
阅读全文
摘要:推荐文章: java7/8中的hashmap跟currentHashMap 关于RESIZE_STAMP_BITS字段的一些解释 扩容图解 网上的文章,jdk7版本的比较多,由于自己本地是jdk8,所以还是整理jdk8的逻辑吧。 一、结构跟思路说明,主要字段解释 HashMap的源码我们比较清楚,大
阅读全文
摘要:condition是对线程进行控制管理的接口,具体实现是AQS的一个内部类ConditionObject,主要功能是控制线程的启/停(这么说并不严格,还要有锁的竞争排队)。 condition主要方法: void await() throws InterruptedException 进入等待,直到
阅读全文
摘要:读写锁,对于读操作来说是共享锁,对于写操作来说是排他锁,两种操作都可重入的一种锁。底层也是用AQS来实现的,我们来看一下它的结构跟代码: 读写锁,当然要区分读跟写两种操作,因此其内部有ReadLock跟WriteLock两种具体实现。但两者也有交互的地方,比如获取写锁要判断当前是否有线程在读,有的话
阅读全文
摘要:读写锁,对于读操作来说是共享锁,对于写操作来说是排他锁,两种操作都可重入的一种锁。底层也是用AQS来实现的,我们来看一下它的结构跟代码: 读写锁,当然要区分读跟写两种操作,因此其内部有ReadLock跟WriteLock两种具体实现。但两者也有交互的地方,比如获取写锁要判断当前是否有线程在读,有的话
阅读全文
摘要:参考文章:https://www.cnblogs.com/charlesblc/p/5994162.html 刚开始认识volatile的时候,觉得对它的一些特性非常迷惑。比如:具有可见性,如果一个线程修改了volatile变量的值,那么其它线程也会发现这一点;同时它又不具有原子性,多个线程对被vo
阅读全文
摘要:本部分主要参考《java并发编程艺术》一书相关内容,同时参考https://blog.csdn.net/zhilinboke/article/details/83104597,说的非常形象。 重入锁就是支持重入的锁,它表示该锁支持一个线程对资源的重复加锁。比如之前的在读AQS时的Mutex,在loc
阅读全文
摘要:接下来从实现角度来分析同步器是如何完成线程同步的。主要包括:同步队列、独占式同步状态获取与释放、共享式同步状态获取与释放以及超时获取同步状态等。 1、同步队列 同步器依赖内部的一个同步队列来完成同步状态的管理。当线程获取同步状态失败时,会被加入到队列中,并同时阻塞线程。当同步状态释放时,会把首节点中
阅读全文
摘要:AQS是用来构建锁或者其它同步组件的基础框架,它使用一个int变量来表示同步状态,通过内置的FIFO队列来完成获取线程的排队工作,concurrent包的作者Doug Lea期望它能称为实现大部分同步需求的基础。 同步器的使用方式是继承,子类通过继承AQS并实现它的相关方法来管理同步状态,在子类方法
阅读全文
浙公网安备 33010602011771号