随笔分类 - 并行程序设计
针对多线程环境下的程序设计,如何更加以优雅的方式设计与开发并还能以最快的速度运行
    
摘要:先来提出问题和给出答案,之后再刨根问底的揭开面纱: 问:volatile 的可见性和禁止指令重排序是怎么实现的? 答:可见性:是通过缓存一致性协议来达到的 禁止指令重排序:JMM 模型里有 8 个指令来完成数据的读写,通过其中 load 和 store 指令相互组合成的 4 个内存屏障实现禁止指令重
        阅读全文
            
摘要:来看一道笔试题: 模拟一个容器,有 2 个线程生成数据写入,10 个线程消费的生产者消费者模型
        阅读全文
            
摘要:CLH 队列 CLH同步队列是一个FIFO双向队列,AQS 依赖它来完成同步状态的管理,当前线程如果获取同步状态失败时,AQS则会将当前线程已经等待状态等信息构造成一个节点(Node)并将其加入到CLH同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点唤醒(公平锁),使其再次尝试获取同步状态
        阅读全文
            
摘要:背景 这篇博文是接着上一篇 线程池专题 的一个补充,是针对线程池底层队列的种类做一个进一步的深入详解,上一篇博文主要针对一线大厂针对线程池的灵魂 5 问展开的,而这一篇也是综合了另外面试经验,把底层的一些内容再深入剖析一下。 线程池任务处理 如果运行的线程数 < corePoolSize,则 Exe
        阅读全文
            
摘要:背景 线程池的基本介绍、为什么使用线程池以及使用线程池的配置等基础篇可以参考我之前的一篇博文:JAVA 线程池基本总结 今天这里主要针对面试相关的再进行一次有针对性的整理和总结,每个细节点都是被问到过的,所以每个细节点都需要搞明白,搞透。 面试题目 来看一下灵魂 5 连问 1、什么是线程池? 2、说
        阅读全文
            
摘要:我们知道,concurrent包是基于AQS (AbstractQueuedSynchronizer)框架,AQS框架借助于两个类:Unsafe(提供CAS操作) 和 LockSupport(提供park/unpark操作)。因此,LockSupport可谓构建concurrent包的基础之一。理解
        阅读全文
            
摘要:1、Lock Lock 是一个接口,具体定义如下: public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLoc
        阅读全文
            
摘要:我们需要先从线程来讲起,相关基本概念这里就不做过多的阐述,都太基本了,有需要可以参考:synchronized 相关概念。这里先从线程状态聊起 1、线程状态 线程共有 5 种状态: 新建状态:新建线程对象,并没有调用start()方法之前 就绪状态:调用start()方法之后线程就进入就绪状态,但是
        阅读全文
            
摘要:协程概念 “协程”(Coroutine)概念最早由 Melvin Conway 于 1958 年提出。虽然被提出的时间很早,但是使用它的年限很短。尤其是最近几年,随着 Go、Lua 等语言的流行,把协程推向了一个新的高潮。 协程其实可以认为是比线程更小的执行单元。为啥说他是一个执行单元,因为他自带C
        阅读全文
            
摘要:1、启动方式 .run() 和 .start() 注意:直接执行线程的 run() 方法,但是线程调用 start() 方法时也会运行 run() 方法,区别就是一个是由线程调度运行 run() 方法,一个是直接调用了线程中的 run() 方法!! 2、线程中常用方法 start:开始执行该线程 s
        阅读全文
            
摘要:合理利用线程池能够带来三个好处。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 第三:提高线程的可管理性。 线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池
        阅读全文
            
摘要:1. List遍历时修改报错 别的先什么都不说,直接上代码看看就知道了: 运行以上代码报错如下所示: 查看jdk源代码中AbstractList的checkForComodification方法的源码,分析产生ConcurrentModificationException异常的原因发现错误原因了,具
        阅读全文
            
摘要:传统集合实现同步的问题 举了一个例子:Map集合线程不同步导致的问题。 解决办法:使用同步的Map集合 使用集合工具类中的方法将不同步的集合转为同步的Collections.synchronizedMap(newMap())这个方法返回一个同步的集合 public static <K, V> Map
        阅读全文
            
摘要:队列包含固定长度的队列和不固定长度的队列,队列的规则就是:先进先出。固定长度的队列往里放数据,如果放满了还要放,阻塞式队列就会等待,直到有数据取出,空出位置后才继续放;非阻塞式队列不能等待就只能报错了。 查看Condition的JDK文档时,其中简单的模拟实现了阻塞队列的原理,Java中也已经为我们
        阅读全文
            
摘要:申明:用大白话来说就是用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人会一直等待第二个人,直到第二个人拿着数据到来时,才能彼此交换数据。 java.util.concurrent.Exchanger<V> V 表示可以交换的对象类型 对应构造方法摘要: E
        阅读全文
            
摘要:申明:CountDownLatch好像倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当到达0时,所有等待者就开始执行。 java.util.concurrent.CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一
        阅读全文
            
摘要:JDK包位置:java.util.concurrent.CyclicBarrier 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因
        阅读全文
            
摘要:Semaphore可以维护当前访问自身的线程个数,并且提供了同步机制。 Semaphore实现的功能类似于厕所里有5个坑,有10个人要上厕所,同时就只能有5个人占用,当5个人中 的任何一个让开后,其中在等待的另外5个人中又有一个可以占用了。另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后
        阅读全文
            
摘要:Condition的功能类似在传统线程技术中的 Object.wait() 和 Object.natify() 的功能,传统线程技术实现的互斥只能一个线程单独干,不能说这个线程干完了通知另一个线程来干,Condition就是解决这个问题的,实现线程间的通信。比如CPU让小弟做事,小弟说我先歇着先让大
        阅读全文
            
摘要:Java5的线程并发库中,提供了相应的线程锁接口Lock来帮助我们同步处理。Lock比传统线程模型中的synchronized更加面向对象,锁本身也是一个对象,两个线程执行的代码要实现同步互斥效果,就要使用同一个锁对象。锁要上在要操作的资源类的内部方法中,而不是线程代码中。 java.util.co
        阅读全文
            
 
                    
                
 浙公网安备 33010602011771号
浙公网安备 33010602011771号