![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发
文章平均质量分 60
并发处理是人类压榨计算机运算能力的最有力武器。
crazy-tiger
开弓没有回头箭
展开
-
使用Unsafe做一个简单的CAS自旋锁
AQS底层使用的Unsafe类的compareAndSwapInt的方式加上volatile变量来做的多线程的无锁更新。所以想着是不是可以直接使用这种方式做一个简单的自旋锁。AbstractQueuedSynchronizer(AQS)的代码如下: /** * Setup to support compareAndSet. We need to natively implement * this here: For the sake of permitting futur.原创 2021-07-13 16:31:14 · 246 阅读 · 0 评论 -
从ReentrantLock的实现看AQS的原理及应用(转自美团技术团队)
前言Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过ReentrantLock的基本特性和ReentrantLock与AQS的关联,来深入解读AQS相关独占锁的知识点,同时采取问答的模式来帮助大家理解AQS。由于篇幅原因,本篇文章主要阐述AQS中独占锁的逻辑和Sync转载 2021-05-24 09:36:39 · 328 阅读 · 2 评论 -
具有重置功能的 CountDownLatch(来自RocketMQ源码)
从 RocketMQ 中摘抄工具类,具有重置功能的 CountDownLatch/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownersh.原创 2021-01-13 18:07:17 · 625 阅读 · 2 评论 -
读《Java并发编程实战》全书笔记
读《Java并发编程实战》全书笔记。完全是按照个人阅读记录的。如果需要了解更多,请购买正版书。原创 2020-10-23 00:36:16 · 224 阅读 · 0 评论 -
Michael-Scott(Michael and Scott,1996)非阻塞算法中的插入算法
Michael-Scott(Michael and Scott,1996)非阻塞算法中的插入算法原创 2020-10-22 19:37:23 · 381 阅读 · 0 评论 -
使用 Treiber 算法(Treiber,1986)构造的非阻塞栈
使用 Treiber 算法(Treiber,1986)构造的非阻塞栈原创 2020-10-22 17:35:04 · 224 阅读 · 0 评论 -
使用 wait 和 notifyAll 来实现可重新关闭的阀门
使用 wait 和 notifyAll 来实现可重新关闭的阀门原创 2020-10-19 18:32:02 · 167 阅读 · 0 评论 -
ThreadPoolExecutor的饱和策略——线程池
线程池的四种饱和策略说明。原创 2020-10-14 20:27:49 · 1066 阅读 · 0 评论 -
CompletionService 使用说明
读《Java并发编程实战》6.3.5 笔记。如果向 Executor 提交了一组计算任务,并且希望在计算完成后获得结果,那么可以保留与每个任务的关联的 Future,然后反复使用 get 方法,同时将参数 timeout 指定为 0,从而通过轮询来判断任务是否完成。这种方法虽然可行,但却有些繁琐。幸运的是,还有一种更好的方法:完成服务 (CompletionService)说明:CompletionService 将 Executor 和 BlockingQueue 的功能融合在一起。.原创 2020-10-13 20:06:45 · 429 阅读 · 0 评论 -
使用volatile类型发布不可变对象 ( 转 )
最近在看《java并发编程实践》这本书,看到关于不可变对象的介绍,以前并没有接触过,感觉不错。在这里介绍一下。volatile简介volatile 是 java 的一种削弱的同步,volatile 的功能只是能够保证对于变量修改时能够保证立即写入内存。被声明的变量能够保证可见性,但是并不能够满足原子性,整个过程中还是可以同时被其他的线程改变。所以volatile使用有一定的局限性,对于 volatile 的详细介绍可以参考一下这里,我就不班门弄斧了,这里主要介绍一下一种新学习的处理同步的方法:不可变.转载 2020-10-11 16:13:33 · 314 阅读 · 0 评论 -
操作系统线程的实现(基于JAVA)
读《深入理解Java虚拟机》第三版,周志明著。我们知道,线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调用分开,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度。目前线程是 Java 里面进行处理器资源调度的最基本单位,不过如果日后 Loom 项目(https://wiki.openjdk.java.net/display/loom/Main)能成功为 Java 引入纤程(Fiber)的话,可能就会改变这一点。主流的操作系统都提供了线程实现,J.原创 2020-10-08 10:16:03 · 779 阅读 · 2 评论 -
常见并发工具类(JDK 8 例子使用)
读《Java并发编程的艺术》笔记。一、CountDownLatch等待多线程完成的CountDownLatch,允许一个或多个线程等待其他线程完成操作。底层依赖AQS实现。例子:import java.util.concurrent.CountDownLatch;/** * {@link CountDownLatch} 测试类 * <p> * * @author hyl * @version v1.0: CountDownLatchTest.java, v 0.1 .原创 2020-10-06 09:24:03 · 298 阅读 · 0 评论 -
Java中的阻塞队列(JUC)
读《Java并发编程的艺术》笔记。一、什么是阻塞队列阻塞队列(BlockingQueue)是一个支持两个附近操作的队列。这两个附加的操作支持阻塞的插入和移除方法。 支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,知道队列不满。 支持阻塞的移除方法:意思时在队列为空时,获取元素的线程会等待队列变为非空。阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。二、阻塞队列的.原创 2020-10-04 17:31:24 · 189 阅读 · 0 评论 -
Unsafe 类的API说明
Unsafe 类的 API 的中英文说明转载 2020-10-04 16:10:24 · 114 阅读 · 0 评论 -
队列同步器(AbstractQueuedSynchronizer ,AQS) (JDK 8)
读《Java并发编程的艺术》笔记。队列同步器(AbstractQueuedSynchronizer ,AQS)队列同步器 (AbstractQueuedSynchronizer),是用来构建锁或者其他同步组件的基础框架,它使用了一个 int 成员变量表示同步状态,通过内置的 FIFO 队列来完成资源获取线程的排队工作,并发包的作者(Doug Lea)期望它能成为实现大部分同步需求的基础。同步器是实现锁(也可以是任意同步组件)的关键,在锁的实现中聚合同步器,利用同步器实现锁的语义。可以这样理解两者.原创 2020-09-26 00:55:46 · 203 阅读 · 0 评论 -
wait 方法注释中的标准使用模式(JDK 8)
查看 java.lang.Object#wait(long) 方法的注释时,发现了在注释中给了一个使用范例,同时JDK中也其他地方竟然也使用了这种范例,于是来了兴趣,记录一下。一、原注释简要说明,就是为了防止 “ 伪唤醒 ”等,需要使用条件循环来做再次判断。好的。这里提到了两本书有详细的介绍。找了这两本书的说明如下:1.1 、《Java并发编程实战》说明:过早唤醒虽然在锁、条件谓词和条件队列之间的三元关系并不复杂,但 wait 方法的放回并不一定意味着线程正在等待的条件谓词已经变成真了。.原创 2020-09-23 22:59:20 · 297 阅读 · 0 评论 -
从源码注释中了解 sleep 和 wait 的区别(JDK 8)
sleep 指的是 java.lang.Thread#sleep(long)wait 指的是 java.lang.Object#wait()一、源码注释sleep :wait :这里调用了 wait(0);,所以这里也贴出 wait(long)。wait(long) :二、解读2.1、sleep从注释中可以得到如下几点:1、thread to sleep 线程进入休眠,线程的状态是TIMED_WAITING。2、The thread does not lose owner.原创 2020-09-23 08:47:16 · 402 阅读 · 0 评论 -
Java 中断线程 (JDK 8)
读《Java核心技术 卷一》记录。当线程得 run 方法执行方法体中最后一条语句后,并经由执行 return 语句返回时,或者出现了在方法中没有捕获的异常时,线程将终止。在Java的早期版本中,还有一个 stop 方法,其他线程可以调用它终止线程。但是,这个方法现在已经被弃用了。(因为暴力停止)没有可以强制线程终止的方法。然而,interrupt 方法可以用来请求终止线程。当对一个线程调用 interrupt 方法时,线程的中断状态将被置位。这是每个线程都具有的 Boolean 标志。每个线程都应.原创 2020-09-23 03:48:43 · 293 阅读 · 0 评论 -
双重检查锁定(Double-Checked Locking)的问题和解决方案
读《Java并发编程的艺术》方腾飞、魏鹏、程晓明著。笔记一、什么是双重检查锁定为了提高性能,会延迟初始化某些类,在第一次使用的时候做类的初始化。为了保证多线程下的线程安全,一般会做安全同步。简单的方式就是如下:public class Singleton { private static Singleton instance; public synchronized Singleton getInstance() { if (instance == nu.原创 2020-09-22 02:20:53 · 12141 阅读 · 0 评论 -
什么是线程安全性(Java Concurrency in Practice)
当多个线程访问某个类时,不管运行时环境采用何种调用方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类时线程安全的。原创 2020-09-16 22:09:35 · 248 阅读 · 0 评论 -
Java 先行发生原则(Happens-Before)
先行发生原则可以判断数据是否存在竞争,线程是否安全。 如果两个操作之间缺乏 happens-before关系,那么 JVM 可以对它们任意地排序。原创 2020-09-16 03:08:05 · 520 阅读 · 0 评论 -
Java 内存模型(Java Memory Model)——深入理解Java虚拟机
读《深入理解Java虚拟机》第三版,周志明著,笔记。了解Java内存模型是开始Java并发编程的基础。官方文档 https://download.oracle.com/otndocs/jcp/memory_model-1.0-pfd-spec-oth-JSpec/《Java虚拟机规范》Java SE 6 https://docs.oracle.com/javase/specs/jvms/se6/html/Threads.doc.html在后续的jsr-133中定义有所差异,这里主要以书和虚拟机规范.原创 2020-09-15 03:43:31 · 286 阅读 · 0 评论