随笔分类 - 并发编程实战
摘要:synchronized是jdk中的关键字,保证了原子性、可见性、有序性。本文主要探讨可见性的相关问题。可见性是指一个线程对共享变量的修改,是否对其他线程可见。JMM中规定了,lock操作会从主存中刷新最新共享变量的值到工作线程,而unlock会将工作线程中的值同步会主存。所以synchronize
阅读全文
摘要:之前读CHM的源码(JDK8),其中有一段印象比较深,它内部有一个Node数组,volatile修饰, transient volatile Node<K,V>[] table; 。而Node对象本身,存储数据的val变量,也是用volatile修饰的。这两个一个是保证扩容时,变更table引用时的
阅读全文
摘要:1. 继承体系 FutureTask实现了Runnable接口,实现了run() 方法,可以交给线程/线程池执行。实现了Future接口,实现了get()方法,可以获取执行的结果。 2. 重要属性 /** * Possible state transitions: * NEW -> COMPLETI
阅读全文
摘要:之前了解Synchronized不多,只知道同步代码插入了两个字节码指令,同步方法提前获取管程。近来看了很多写的很好的博客,了解了底层的实现方法。这里做一下记录,主要还是拾人牙慧。 Synchronized底层使用c++实现,在JDK1.6之后,加入了很多优化的技术,减少线程阻塞和唤醒的开销,具体可
阅读全文
摘要:AQS概念 AQS是用于构建锁和同步器的框架。ReentrantLock、信号量、闭锁、FutureTask等等都是基于AQS构建的。其内部封装了对等待线程队列维护,同时开放接口自定义共享资源的获取和释放。 AQS负责管理同步器类中状态的整数信息,通过getState,setState和compar
阅读全文
摘要:1. 核心参数 核心线程数,最大线程数,非核心线程生存时间,任务队列,线程工厂,任务溢出策略。 2.线程池状态 1.RUNNING:线程池创建完毕后进入运行中 2.SHUTDOWN:执行shutDown方法,不再接收任务,但会处理现有的任务包括队列中的任务 4.STOP:执行shutDownNow方
阅读全文
摘要:5.1 同步容器类 Vector,Hashtable。对所有公有方法都是同步方法,使用synchronized修饰 5.1.1 同步容器类的问题 特殊情况还是需要客户端加锁。比如线程A遍历容器元素,线程B对同一个容器删除元素,会出现并发修改异常。解决办法是在客户端封装一层加锁方法。 public s
阅读全文
摘要:3.1 可见性 一个线程修改了变量保证对其他线程可见 3.1.1 失效数据 读取的数据的旧值。 3.1.2 非原子的64位操作 非volatile类型的long和double变量,将64位的操作分成两个32位,此种情况是线程不安全的。 3.1.3 加锁与可见性 通过加锁,线程对变量的修改,对下个获取
阅读全文
摘要:2.1 什么是线程安全性 当多个线程访问某个类,这个类始终表现出正确的行为,称这个类是线程安全的。 线程安全类:无状态类 完全由线程安全类组成的程序不一定是线程安全的,线程安全类中也可以包含非线程安全的类。 2.2 原子性 一系列操作不可分。 2.2.1 竞态条件 不恰当的执行顺序出现不正确的结果,
阅读全文
摘要:当一个线程处于阻塞状态时,需要提供一种唤醒机制。例: 1 public static void main(String[] args) { 2 Thread t = new Thread(() -> { 3 try { 4 Thread.sleep(5000); 5 } catch (Interru
阅读全文
摘要:Synchronized的作用方式: 作用于代码块 作用于实例方法 作用于静态方法 作用于对象 1. 同步代码块和同步实例方法的区别:只有进入同步代码块才会锁住对象,而进入同步方法立即锁住对象。 public void print(){ System.out.print("进入方法+线程:" + T
阅读全文
摘要:1.非阻塞算法 如果在算法中,一个线程的失败或挂起不会导致其他线程也失败或挂起,那么这种算法就称为非阻塞算法。如果这种算法的每个步骤中都存在某个线程能够执行下去,那么这种算法也称为无锁算法。 这种算法利用底层的原子机器指令代替锁来确保数据在并发访问中的一致性。 2.硬件对并发的支持 2.1 CAS(
阅读全文
摘要:1.Lock(接口) 和 ReentrantLock(实现类) 与内置加锁机制不同的是,Lock提供了一种无条件的、可轮询的、定时的以及可中断的锁获取方式,所有加锁和解锁的方法都是显式的。 ReentrantLock实现了Lock接口,提供和synchronized相同的互斥性和内存可见性。 2.为
阅读全文
摘要:1.当操作性能受某种特定的资源而收到限制时,通常称该操作为资源密集型的操作 2.与单线程相比,多个线程总会引入一些额外的开销,比如:线程之间的协调(加锁、触发信号、内存同步等),增加的上下文切换,线程的创建与销毁,线程的调度。 上下文切换:操作系统将某个正在运行的线程调度出来,从而使其他线程使用CP
阅读全文
摘要:1.死锁 检测死锁:在等待关系的有向图中搜索循环。 产生死锁的4个必要条件: 1)互斥条件:共享资源独占访问 2)不可剥夺条件:不能强制其他线程释放资源 3)请求和保持条件:在等待申请的新的资源时,继续占有已分配的资源 4)循环等待条件:发生死锁时,存在一个循环等待的队列{P1, P2, P3, .
阅读全文
摘要:1.创建线程的方式 1.继承Thread类创建线程 2.实现Runnable接口创建线程 3.使用Callable和Future创建线程 (参考:https://www.cnblogs.com/3s540/p/7172146.html) 2.Executor框架——将任务的提交过程和执行过程解耦 /
阅读全文
摘要:1.中断:每个线程都有一个boolean类型的中断状态,中断是一种协作机制。 public class Thread{ //中断目标线程 public void interrupt(){...} //返回目标线程的中断状态 public boolean isInterrupted(){...} //
阅读全文

浙公网安备 33010602011771号