并发编程
文章平均质量分 85
并发编程
程大帅气
此人很帅,什么都没有写
展开
-
Java并发编程之指令重排序
在我们面试过程中,通常避免不了会被问到什么是指令重排序?本文就这个问题进行探索。重排序前言一、重排序种类二、happens-before三、重排序1.数据依赖性2. as-if-serial语义3.程序顺序规则4.重排序在多线程中的影响前言在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。一、重排序种类在java语言中,重排序分为3种。编译器优化的重排序。编译器在不改变单线程程序的语义前提下,可以重新安排语句的执行顺序。指令级并行的重排序。现在处理器采用了指令集并行技术,原创 2021-11-23 23:36:07 · 4494 阅读 · 1 评论 -
Java并发编程之volatile可见及非原子特性
特性可见性:对一个volatile的读,总能看到对这个volatile变量的最后写入原子性:对于一个bolatile变量的单个读/写操作具有原子性,但类似于voliatile++这种复合操作不具有原子性验证原子性public class VolatileThread extends Thread { // 1.能够保证可见 当一个线程在修改我们主内存共享变量的数据 对另外一个线程可见 private volatile static boolean flag = true;原创 2021-11-23 14:10:07 · 222 阅读 · 0 评论 -
Java并发编程之一张图理解ContDownLatch
Java并发编程之你们常说的CAS到底是个啥?!.Java并发编程之一张图理解ReentrantLock.前面的文章理解了java中实现的乐观锁CAS思想,也理解了ReentrantLock中AQS的思想,今天本文主要介绍JUC中常用的几个工具。ContDownLatchSemphoreCyclicBarrier...原创 2021-05-30 01:02:52 · 185 阅读 · 0 评论 -
Java并发编程之一张图理解ReentrantLock
一张图理解ReentrantLock1.lock()跟踪源码1.1.非公平锁实现1.1.1.tryAcquire(arg)1.1.2.acquireQueued(addWaiter(Node.EXCLUSIVE), arg)1.2.公平锁实现1.2.1.tryAcquire(arg)首先看图。1.lock()跟踪源码这里对公平锁和非公平锁做了不同实现,由构造方法参数决定是否公平。public ReentrantLock(boolean fair) { sync = fair ? new原创 2021-05-22 23:38:53 · 1019 阅读 · 16 评论 -
Java并发编程之多线程基本原理
线程执行基本原理我们要搞清楚线程是怎样被启动的,就需要先搞清楚CPU调度算法,操作系统的调度算法有很多,比如先来先服务(FIFO)、最短优先、时间片轮转等。那么当调用线程的start()方法后,它具体做了什么呢?看下面这张图。实际上,我们在将一个线程置为运行状态时,也就是调用start()方法时,在JVM和操作系统层面,JVM像操作系统发送了两个指令os:: create thread和os:: start thread操作系统根据调度算法来分配CPU资源用于执行这两个指令,执行完毕后回调JVM中的原创 2021-05-16 10:49:42 · 135 阅读 · 1 评论 -
Java并发编程之你们常说的CAS到底是个啥?!
独占锁是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁用到的机制就是CAS,Compare and Swap。简单的理解,CAS操作包含三个操作数:内存值(V)、预期原值(A)、新值(B)。如果内存值(V)与预期原值(A)相匹配,那么就会自动将该内存位置的值(V)更新为新值(B)。否则,将不更新该位置的值原创 2021-05-12 15:03:35 · 147 阅读 · 0 评论 -
Java并发编程之创建线程池详解
java之创建线程池详解构造方法Executors.newFixedThreadPool()Executors.newSingleThreadExecutor()Executors.newCachedThreadPool()Executors.newScheduledThreadPool()等待队列饱和策略线程工厂Executor是一java线程JUC相关包的顶层接口,里面只有一个Execute方法,用于执行Runnable任务。ExecutorService接口扩展了Executor,增加了线程生命原创 2021-05-12 10:57:17 · 208 阅读 · 0 评论 -
Java并发编程之Semaphore
目录一、概念二、示例三、说明四、其他常用方法一、概念Semaphore令牌。是synchronized的加强版,作用是控制线程的并发数量。Semaphore是一个计数信号量,它的本质是一个共享锁。信号量维护了一个信号量许可集。线程通过调用acquire()来获取令牌/执行许可。当信号量中还有剩余可使用的令牌时,线程就能获取并且执行完毕后归还。信号量中没有可用令牌,线程必须等待,直到有别的线程释放(归还)令牌为止,线程可以通过release()来释放令牌。二、示例/** * @author c原创 2020-07-19 18:28:00 · 158 阅读 · 0 评论 -
Java并发编程之CountDownLatch
目录一、概念二、用法1、一等多2、多等一三、示例1、一等多2、多等一一、概念CountDownLatch简单理解为一个线程间的倒计时工具,可以使一个线程A在等待另外的一些子线程(B、C、D…)完成各自的工作后,A再进行工作。每当一个子线程执行完毕时,计数器就会减一,当计数器减为0时,主线程A再开始执行。二、用法1、一等多某一个线程开始阻塞,直至其他n个线程执行完毕,再唤醒。常用于多线程批量计算,多个线程计算的结果集统一插入数据库(计算过程中要考虑所用工具是否有并发问题)。//初始化一个原创 2020-07-13 23:06:25 · 283 阅读 · 0 评论