第2章:并发编程的其他基础知识
并行与并发区别 并发指同一时间段多个任务同时都在进行,并且都没有执行结束,而并行是说在单位时间内多个任务在同时运行。 并发任务强调在一个时间段内同时进行,而一个时间段有多个单位i时间构成,所以说并发的多个任务在单位时间内不一定同时在执行。 一个CPU同时只能执行一个任务,所以单CPU时代多个任务都是并发执行的。 注:在多线程时间中,线程的个数往往多于CPU个数,所以即使存在并行...
并行与并发区别 并发指同一时间段多个任务同时都在进行,并且都没有执行结束,而并行是说在单位时间内多个任务在同时运行。 并发任务强调在一个时间段内同时进行,而一个时间段有多个单位i时间构成,所以说并发的多个任务在单位时间内不一定同时在执行。 一个CPU同时只能执行一个任务,所以单CPU时代多个任务都是并发执行的。 注:在多线程时间中,线程的个数往往多于CPU个数,所以即使存在并行...
第1章:并发编程线程基础 wait() 如果调用wait()方法的线程没有实现获取该对象的监视器锁,则调用wait()方法时线程会抛出IllegalMonitorStateException异常。 一个线程获取一个共享变量的监视器锁的方法 执行synchronized同步代码块时,使用该共享变量作为参数: synchronized(共享变量) { //do someth...
CountDownLatch原理剖析 日常开发中经常遇到一个线程需要等待一些线程都结束后才能继续向下运行的场景,在CountDownLatch出现之前通常使用join方法来实现,但join方法不够灵活,所以开发了CountDownLatch。 示例 public static void main(String[] args) throws InterruptedException { ...
Future,FutureTask,ExecutorService… 用上FutureTask任务获取结果老少皆宜, 就是CPU有消耗. FutureTask也可以做闭锁(实现了Future的语义, 表示一种抽象的可计算的结果). 通过把Callable作为一个属性, 进而把它自己作为一个执行器去继承Runnable, FutureTask实际上就是一个支持取消行为的异步任务执行器....
同步框架AbstractQueuedSynchronizer java并发核心在于 java.concurrent.util 当中同步器的实现 同步容器 解决并发情况下的容器线程安全问题。给多线程环境准备一个线程安全的容器对象 线程安全的容器对象L Vector,Hashtable;它们时通过synchronized方法实现的。 concurrent 包中的同步容器,大多数是使用系...
乐观锁加重试,并发更新数据库一条记录导致:Lock wait timeout exceeded 背景: mysql数据库,用户余额表有一个version(版本号)字段,作为乐观锁。 更新方法有事务控制: @Transactional(rollbackFor = Exception.class) 更新时,比对版本号,如果版本号不一致,则更新失败。 有重试机制,如果更新失败,则...
volatile关键字 volatile关键字的主要作用是使变量在多个线程间可见 一个线程可以执行的操作有使用(use)、赋值(assign)、装载(load)、存储(store)、锁定(lock)、解锁(unlock)。 而主内存可以执行的操作有读(read)、写(write)、锁定(lock)、解锁(unlock),每个操作都是原子的。 volatile的作用就是强制线程到主内存...
synchronized关键字的基本语义 synchronized锁什么? 锁对象。是一个对象锁 可能锁的对象包括: this,临界资源对象,Class类对象
synchronized synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种: 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象; 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象; 修改一个静态的方法,其作用的范围是整个静态方法...
Disruptor Disruptor 术语说明: RingBuffer: 被看做Disruptor最主要的组件,然而从3.0开始RingBuffer 仅仅负责存储和更新在Disruptor中流通的数据。对一些特殊的使用场景能够被用户(使用其他数据结构)完全替代 Sequence:Disruptor 使用 Sequence 来表示一个特殊组件处理的序号,和 Disruptor 一...