随笔分类 -  多线程

1
摘要:一、概念 1、同步:A调用B,B处理直到获得结果,才返回给A。需要调用者一直等待和确认调用结果是否返回,然后继续往下执行。 2、异步:A调用B,无需等待结果,B通过状态通知A或回调函数来处理。调用结果返回时,会以消息或回调的方式通知调用者。 3、阻塞:A调用B,A被挂起直到B返回结果给A,才能继续执 阅读全文
posted @ 2020-10-18 16:32 linghu_java 阅读(151) 评论(0) 推荐(0) 编辑
摘要:一、什么是内存模型,为什么要使用它 如果缺少同步,那么将会有许多因素使得线程无法立即甚至永远看到一个线程的操作结果 编译器把变量保存在本地寄存器而不是内存中 编译器中生成的指令顺序,可以与源代码中的顺序不同 处理器采用乱序或并行的方式来执行指令 保存在处理器本地缓存中的值,对于其他处理器是不可见 在 阅读全文
posted @ 2018-05-17 21:00 linghu_java 阅读(761) 评论(0) 推荐(0) 编辑
摘要:非阻塞算法:使用底层的原子机器指令(例如比较并交换指令)代替锁来确保数据在并发访问中的一致性 应用于在操作系统和JVM中实现线程 / 进程调度机制、垃圾回收机制以及锁和其他并发数据结构 可伸缩性和活跃性上拥有巨大的优势,不存在死锁 原子变量:提供了与volatile类型变量相同的内存语义,并支持原子 阅读全文
posted @ 2018-05-17 20:59 linghu_java 阅读(416) 评论(0) 推荐(0) 编辑
摘要:一、状态依赖性管理 对于单线程程序,某个条件为假,那么这个条件将永远无法成真 在并发程序中,基于状态的条件可能会由于其他线程的操作而改变 1 可阻塞的状态依赖操作的结构 2 3 acquire lock on object state 4 while (precondition does not h 阅读全文
posted @ 2018-05-12 16:14 linghu_java 阅读(323) 评论(0) 推荐(0) 编辑
摘要:并发程序中潜在错误的发生并不具有确定性,而是随机的。 安全性测试:通常会采用测试不变性条件的形式,即判断某个类的行为是否与其规范保持一致 活跃性测试:进展测试和无进展测试两方面,这些都是很难量化的(性能:即吞吐量,响应性,可伸缩性测试) 一、正确性测试 重点:找出需要检查的不变性条件和后验条件 1、 阅读全文
posted @ 2018-05-11 16:10 linghu_java 阅读(421) 评论(0) 推荐(0) 编辑
摘要:一个对象是否需要是线程安全的取决于它是否被多个线程访问。 当多个线程访问同一个可变状态量时如果没有使用正确的同步规则,就有可能出错。解决办法: 不在线程之间共享该变量 将状态变量修改为不可变的 在访问状态变量时使用同步机制 完全由线程安全类构造的程序也不一定是线程安全的,线程安全类中也可以包含非线程 阅读全文
posted @ 2018-05-11 16:08 linghu_java 阅读(470) 评论(0) 推荐(0) 编辑
摘要:我们不仅仅希望防止某个线程使用某个状态时,另一个线程在修改它;我们还希望某个线程修改了某个状态后,其他线程能够看到状态的变化。 一、可见性 重排序:在没有同步的情况下,编译器、处理器可能对代码的执行顺序进行一些调整 例如如下代码,由于没有使用同步机制,读线程可能看不见ready的修改,而一直循环下去 阅读全文
posted @ 2018-05-11 16:06 linghu_java 阅读(332) 评论(0) 推荐(0) 编辑
摘要:一、设计线程安全的类 找出构造对象状态的所有变量(若变量为引用类型,还包括引用对象中的域) 约束状态变量的不变性条件 建立对象状态的并发访问管理策略(规定了如何维护线程安全性) 1、收集同步需求(找出复合操作、多个变量遵循原子性的操作等) 2、依赖状态的操作(找出操作是否基于先验条件,例:取出当队列 阅读全文
posted @ 2018-05-11 16:04 linghu_java 阅读(449) 评论(0) 推荐(0) 编辑
摘要:委托是创建线程安全类的一个最有效的策略:只需让现有的线程安全类管理所有的状态即可。 一、同步容器类 1、同步容器类的问题 同步容器类都是线程安全的,容器本身内置的复合操作能够保证原子性,但是当在其上进行客户端复合操作则需要额外加锁保护其安全性 由于同步容器类要遵守同步策略,即支持客户端加锁,但必须清 阅读全文
posted @ 2018-05-11 16:01 linghu_java 阅读(309) 评论(0) 推荐(0) 编辑
摘要:任务:通常是一些抽象的且离散的工作单元。大多数并发应用程序都是围绕"任务执行"来构造的,把程序的工作分给多个任务,可以简化程序的组织结构便于维护 一、在线程中执行任务 任务的独立性:任务并不依赖于其他任务的状态,结果和边缘效应。独立的任务可以实现并行执行 1、串行的执行任务 所有的任务放在单个线程中 阅读全文
posted @ 2018-05-11 15:57 linghu_java 阅读(480) 评论(0) 推荐(0) 编辑
摘要:取消和关闭任务的方法:标志状态域、中断、Future、重写不可中断的阻塞的interrupt()方法、通过线程池的shutdown()和shutdownNow()方法、生产者消费者中加入毒丸对象、try finally中处理非常正线程终止。 阅读全文
posted @ 2018-05-11 15:53 linghu_java 阅读(420) 评论(0) 推荐(0) 编辑
摘要:一、在任务和执行策略之间隐性耦合 Executor框架将任务的提交和它的执行策略解耦开来。虽然Executor框架为制定和修改执行策略提供了相当大的灵活性,但并非所有的任务都能适用所有的执行策略。 依赖性任务:依赖其他同步任务的结果,使其不得不顺序执行,影响活跃性 使用线程封闭的任务:在单线程的Ex 阅读全文
posted @ 2018-05-11 15:45 linghu_java 阅读(528) 评论(0) 推荐(0) 编辑
摘要:在安全性和活跃性之间通常存在着某种制衡 一、死锁 定义:在线程A持有锁L并想获得锁M的同时,线程B持有锁M并尝试获得锁L,线程AB均不会释放自己的锁,那么这两个线程将永远地等待下去 在数据库系统的设中考虑了检测死锁以及从死锁中恢复。JVM没有办法解决死锁,只能在编程和测试时注意不要让死锁发生 1、锁 阅读全文
posted @ 2018-05-11 15:41 linghu_java 阅读(325) 评论(0) 推荐(0) 编辑
摘要:线程的最主要目的是提高程序的运行性能,但性能的提升会导致复杂性的提升,又会导致安全性和活跃性的风险 一、对性能的思考 提升性能意味着用更少的资源做更多地事情。要想通过并发来获得更好的性能,就要更有效地利用现有处理资源 线程使用的额外的性能开销:线程之间的协调(例如加锁、触发信号以及内存同步等),增加 阅读全文
posted @ 2018-05-11 15:36 linghu_java 阅读(342) 评论(0) 推荐(0) 编辑
摘要:一、Lock与ReentrantLock Lock接口中定义了一种无条件、可轮询的、定时的以及可中断的锁获取操作,所有加锁和解锁的方法都是显式的。 ReentrantLock实现了Lock接口,并提供了与synchronized相同的互斥性和内存可见性。ReentrantLock同样提供了可重入的加 阅读全文
posted @ 2018-05-11 15:32 linghu_java 阅读(318) 评论(0) 推荐(0) 编辑
摘要:在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。 以下是本文目录大纲: 一.CountDownLatch用法 二.CyclicBarrier用法 三.Se 阅读全文
posted @ 2018-05-11 11:34 linghu_java 阅读(314) 评论(0) 推荐(0) 编辑
摘要:第一部分:What 在Java中一般通过继承Thread类或者实现Runnable接口这两种方式来创建多线程,但是这两种方式都有个缺陷,就是不能在执行完成后获取执行的结果,因此Java 1.5之后提供了Callable和Future接口,通过它们就可以在任务执行完毕之后得到任务的执行结果。本文会简要 阅读全文
posted @ 2018-05-04 17:49 linghu_java 阅读(3576) 评论(0) 推荐(0) 编辑
摘要:Future是我们在使用java实现异步时最常用到的一个类,我们可以向线程池提交一个Callable,并通过future对象获取执行结果。本篇文章主要讲述了JUC中FutureTask中的一些实现原理。使用的jdk版本是1.7。 Future Future是一个接口,它定义了5个方法: 简单说明一下 阅读全文
posted @ 2018-05-04 15:47 linghu_java 阅读(744) 评论(0) 推荐(0) 编辑
摘要:之前做过一个测试,反复执行过多次,发现结果是一样的: 1. 单线程下synchronized效率最高(当时感觉它的效率应该是最差才对); 2. AtomicInteger效率最不稳定,不同并发情况下表现不一样:短时间低并发下,效率比synchronized高,有时甚至比LongAdder还高出一点, 阅读全文
posted @ 2018-04-25 15:04 linghu_java 阅读(34970) 评论(5) 推荐(12) 编辑
摘要:锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及。本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑。 1、自旋锁 自旋锁 阅读全文
posted @ 2018-04-25 10:22 linghu_java 阅读(496) 评论(0) 推荐(0) 编辑

1
点击右上角即可分享
微信分享提示