Java并发
Living_Z
这个作者很懒,什么都没留下…
展开
-
Java并发编程实战 任务执行总结
在线程中执行任务在围绕 任务执行 来设计应用程序结构时 第一步就是要找出清晰的任务边界 在理想情况下 各个任务之间是相互独立的:任务并不依赖于其他任务的状态 结果或边界效应 独立性有助于实现并发 因为如果存在足够多的处理资源 那么这些独立的任务都可以并行执行 为了在调度与负载均衡等过程中实现更高的灵活性 每项任务还应该表示应用程序的一小部分处理能力串行地执行任务在应用程序中可以通过多种策略来...原创 2019-04-26 10:02:50 · 225 阅读 · 0 评论 -
Java并发编程实战 并发程序的测试总结
在测试并发程序时 所面临的主要挑战在于:潜在错误的发生并不具有确定性 而是随机的 要在测试中将这些故障暴露出来 就需要比普通的串行程序测试覆盖更广的范围并且执行更长的时间正确性测试在为某个并发类设计单元测试时 首先需要执行与测试串行类时相同的分析——找出需要检查的不变性条件和后验条件 幸运的话 在类的规范中将给出其中大部分的条件 而在剩下的时间里 当编写测试时将不断地发现新的规范基于信号量的...原创 2019-05-23 17:49:29 · 609 阅读 · 0 评论 -
Java并发编程实战 原子变量与非阻塞同步机制总结
锁的劣势现代的许多JVM都对非竞争锁获取和锁释放等操作进行了极大的优化 但如果有多个线程同时请求锁 那么JVM就需要借助操作系统的功能 如果出现了这种情况 那么一些线程将被挂起并且在稍后恢复运行 当线程恢复执行时 必须等待其他线程执行完它们的时间片以后 才能被调度执行 在挂起和恢复线程等过程中存在着很大的开销 并且通常存在着较长时间的中断 如果在基于锁的类中包含有细粒度的操作(例如同步容器类 在...原创 2019-05-27 18:39:52 · 153 阅读 · 0 评论 -
Java并发编程实战 性能与可伸缩性总结
对性能的思考要想通过并发来获得更好的性能 需要努力做好两件事情:更有效地利用现有处理资源 以及在出现新的处理资源时使程序尽可能地利用这些新资源性能与可伸缩性应用程序的性能可以采用多个指标来衡量 例如服务时间 延迟时间 吞吐率 效率 可伸缩性以及容量等可伸缩性指的是:当增加计算资源时(例如CPU 内存 存储容量或I/O带宽) 程序的吞吐量或者处理能力能相应地增加评估各种性能权衡因素避免不...原创 2019-05-23 11:28:56 · 203 阅读 · 0 评论 -
Java并发编程实战 构建自定义的同步工具总结
状态依赖性的管理在单线程程序中调用一个方法时 如果某个基于状态的前提条件未得到满足(例如 连接池必须非空) 那么这个条件将永远无法成真 因此 在编写顺序程序中的类时 要使得这些类在它们的前提条件未被满足时就失败 但在并发程序中 基于状态的条件可能会由于其他线程的操作而改变:一个资源池可能在几条指令之前还是空的 但现在却变为非空的 因为另一个线程可能会返回一个元素到资源池 对于并发对象上依赖状态的...原创 2019-05-27 16:07:30 · 179 阅读 · 0 评论 -
Java并发编程实战 避免活跃性危险总结
在安全性与活跃性之间通常存在着某种制衡 我们使用加锁机制来确保线程安全 但如果过度地使用加锁 则可能导致锁顺序死锁(Lock-Ordering Deadlock) 同样 我们使用线程池和信号量来限制对资源的使用 但这些被限制的行为可能会导致资源死锁(Resource Deadlock) Java应用程序无法从死锁中恢复过来 因此在设计时一定要排除那些可能导致死锁出现的条件死锁当一个线程永远地持...原创 2019-05-16 16:51:29 · 146 阅读 · 0 评论 -
Java并发编程实战 图形用户界面应用程序总结
为什么GUI是单线程的许多人曾经尝试过编写多线程的GUI框架 但最终都由于竞态条件和死锁导致的稳定性问题而又重新回到单线程的事件队列模型:采用一个专门的线程从队列中抽取事件 并将它们转发到应用程序定义的事件处理器(AWT最初尝试在更大程度上支持多线程访问 而正是基于在AWT中得到的经验和教训 Swing在实现时决定采用单线程模型)不过 我相信你还是可以成功地编写出多线程的GUI工具包 只要做到...原创 2019-05-16 13:02:19 · 369 阅读 · 0 评论 -
Java并发编程实战 显式锁总结
Lock与ReentrantLockLock接口public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time,TimeUnit unit) throws InterruptedE...原创 2019-05-24 14:52:26 · 145 阅读 · 0 评论 -
Java并发编程实战 取消与关闭总结
任务取消如果外部代码能在某个操作正常完成之前将其置入 完成 状态 那么这个操作就可以称为可取消的(Cancellable) 取消某个操作的原因很多:用户请求取消有时间限制的操作应用程序事件错误关闭在Java中没有一种安全的抢占式方法来停止线程 因此也就没有安全的抢占式方法来停止任务 只有一些协作式的机制 使请求取消的任务和代码都遵循一种协商好的协议其中一种协作机制能设置某个 已...原创 2019-05-07 18:32:17 · 337 阅读 · 0 评论 -
Java并发编程实战 线程池的使用总结
在任务与执行策略之间的隐性耦合Executor框架可以将任务的提交与任务的执行策略解耦开来 将像许多对复杂过程的解耦操作那样 这种论断多少有些言过其实了 虽然Executor框架为制定和修改执行策略都提供了相当大的灵活性 但并非所有的任务都能适用所有的执行策略 有些类型的任务需要明确地指定执行策略 包括:依赖性任务使用线程封闭机制的任务对响应时间敏感的任务使用ThreadLocal的任...原创 2019-05-14 16:08:51 · 441 阅读 · 0 评论 -
Java并发编程实战 基础构建模块总结
同步容器类这些类实现线程安全的方式是:将它们的状态封装起来 并对每个公有方法都进行同步 使得每次只有一个线程能访问容器的状态同步容器类的问题容器上常见的复合操作包括:迭代(反复访问元素 直到遍历完容器中所有元素) 跳转(根据指定顺序找到当前元素的下一个元素)以及条件运算 例如 若没有则添加(检查在Map中是否存在键值K 如果没有 就加入二元组(K V)) 在同步容器中 这些复合操作在没有客户...原创 2019-04-25 09:26:11 · 147 阅读 · 0 评论 -
Java并发编程实战 对象的组合总结
设计线程安全的类在设计线程安全类的过程中 需要包含以下三个基本要素:找出构成对象状态的所有变量找出约束状态变量的不变性条件建立对象状态的并发访问管理策略使用java监视器模式的线程安全计数器@ThreadSafepublic final class Counter { @GuardedBy("this") private long value = 0; publ...原创 2019-04-23 16:21:40 · 181 阅读 · 0 评论 -
Java并发编程实战 线程安全性总结
如果当多个线程访问同一个可变的状态变量时没有使用合适的同步 那么程序就会出现错误 有三种方式可以修复这个问题不在线程之间共享该状态变量将状态变量修改为不可变的变量在访问状态变量时使用同步当设计线程安全的类时 良好的面向对象技术 不可修改性 以及明晰的不变性规范都能起到一定的帮助作用什么是线程安全性当多个线程访问某个类时 不管运行时环境采用何种调度方式或者这些线程将如何交替执行 并且...原创 2019-04-18 14:25:08 · 114 阅读 · 0 评论 -
Java并发编程实战 对象的共享总结
可见性在没有同步的情况下 编译器 处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整 在缺乏足够同步的多线程程序中 要想对内存操作的执行顺序进行判断 几乎无法得出正确的结论有一种简单的方法能避免这些复杂的问题 只要有数据在多个线程之间共享 就使用正确的同步失效数据非线程安全的可变整数类@NotThreadSafepublic class MutableInteger { ...原创 2019-04-22 14:39:08 · 120 阅读 · 0 评论 -
Java并发编程实战 Java内存模型总结
什么是内存模型 为什么需要它如果缺少同步 那么将会有许多因素使得线程无法立即甚至永远 看到另一个线程的操作结果 在编译器中生成的指令顺序 可以与源代码中的顺序不同 此外编译器还会把变量保存在寄存器而不是内存中 处理器可以采用乱序或并行等方式来执行指令 缓存可能会改变将写入变量提交到主内存的次序 而且 保存在处理器本地缓存中的值 对于其他处理器是不可见的 这些因素都会使得一个线程无法看到变量的最新...原创 2019-05-28 15:28:59 · 168 阅读 · 0 评论