并发编程
Java多线程 & 高并发
程人之美
这个作者很懒,什么都没留下…
展开
-
Java并发编程实战 第13章 显示锁
内置锁的局限性:无法中断一个正在等待获取锁的线程,或者无法在请求获取一个锁时无限的等待下去。内置锁必须在获取该锁的代码块中释放,这就简化了编码工作,并且与异常处理操作实现了很好的交互,但却无法实现非阻塞结构的加锁规则。这都是使用synchronnized的原因。13.1 Lock与ReentrantLock必须在finally中释放锁Lock lock = new ReentrantLock();...lock.lock();try { // 更新对象状态 // 捕获异常,并在必要时恢复不变原创 2020-09-03 09:02:36 · 210 阅读 · 0 评论 -
Java并发编程实战 第11章 性能与可伸缩性
线程的主要目的是提高程序的运行性能。提高资源利用率,系统响应性。11.1 对性能的思考多线程开销:线程之间的协调(加锁、触发信号、内存同步),上下文的切换,线程创建和销毁,线程的调度。可伸缩性:当增加计算资源(CPU、内存、存储容量、IO),程序的吞吐朗或者处理能力相应增加。...原创 2020-08-27 09:02:11 · 217 阅读 · 0 评论 -
Java并发编程实战 第10章 活跃性、性能与测试
过度地使用加锁,可能导致锁顺序死锁;过渡的使用线程池和信号量来限制对资源的使用,可能导致资源死锁;10.1 死锁java无法从死锁恢复;数据库设计一般可以恢复,会选择一个牺牲者放弃这个事务。10.1.1 锁顺序死锁如果所有线程以固定的顺序来获得锁,那么程序中就不会出现锁顺序死锁问题。right -》leftleft -》right10.1.2 动态的锁顺序死锁有时候并不清楚是否在锁顺序上有足够的控制权来避免死锁发生。...原创 2020-08-21 09:05:55 · 219 阅读 · 0 评论 -
Java并发编程实战 第9章 图形用户界面应用程序
9.1 为什么GUI是单线程的多线程GUI框架容易发生死锁问题。单线程的GUI框架使用线程封闭机制来实现线程安全性。9.2 短时间的GUI任务9.3 长时间的GUI任务9.4 共享数据模型原创 2020-08-21 08:45:11 · 177 阅读 · 0 评论 -
Java并发编程实战 第8章 线程池的使用
8.1 在任务与执行策略之间的隐形耦合只有当任务都是同类型的并且相互独立时,线程池的性能才能达到最佳。8.1.1 线程饥饿死锁在池中,如果任务A依赖其他任务B,任务B无法完成或者被阻塞,那么可能产生死锁,称为线程饥饿死锁。如果线程池足够大,可能不会死锁。每当提交了一个有依赖性的Executor任务时,要知道可能会出现线程的饥饿死锁,因此需要配置线程池的大小限制或配置限制。8.1.2 运行时间较长的任务如果任务阻塞的时间过长,即使无死锁,线程池的响应性也会变得糟糕。执行时间长的任务不仅会造成线程池原创 2020-08-04 21:58:58 · 199 阅读 · 0 评论 -
Java并发编程实战 第7章 取消与关闭
Java没有提供任何机制来安全地终止线程。但它提供了中断,这是一种协作机制,能够使一个线程终止另一个线程的当前工作。这种协作方法是必要的,我们很少希望某个任务、线程或服务立即停止,因为这种立即停止会使共享数据结构处于不一致的状态。在编写任务和服务时可以使用一种协作的方式:当需要停止时,它们首先会清楚当前旨在执行的工作,然后再结束。任务本身比发出取消请求的代码更清楚如何执行清除工作。行为良好的软件能很完善的处理失败、关闭和取消等过程。7.1 任务取消在Java中没有一种安全的抢占式方法来停止线程。只有一些原创 2020-07-27 23:05:57 · 195 阅读 · 0 评论 -
Java并发编程实战 第6章 任务执行
6.1 在线程中执行任务在理想情况下,各个任务之间时相互独立的:任务并不依赖于其他任务的状态、结果、边界效应。应用程序性希望支持尽可能多的用户,从而降低每个用户的服务成本,而用户则希望获得尽快的响应。6.1.1串行的执行任务6.1.2 显示地为任务创建线程只要请求到达的速率不超出服务器的处理能力。6.1.3 无限制创建线程的不足线程生命周期的开销非常高资源消耗稳定性:线程数的限制值随平台不同,并受JVM启动参数、Thread构造函数中栈大小、以及地层OS对线程的限制等。会抛出OOM等异常。原创 2020-07-03 09:01:42 · 191 阅读 · 0 评论 -
Java并发编程实战 第5章 基础构建模块
委托是创建线程安全类的一个最有效的策略:只需让现有的线程安全类管理所有的状态即可。5.1 同步容器类原创 2020-06-24 01:03:06 · 194 阅读 · 0 评论 -
Java并发编程实战 第4章 对象的组合
4.1 设计线程安全的类三要素:找出构成对象状态的所有变量找出约束状态变量的不变性条件建立对象状态的并发访问管理策略4.1.1 收集同步需求状态空间:对象与变量的所有可能取值。状态空间越小,越容易判断线程的状态。final类型的域使用得越多,就越能建华对象可能状态的分析过程。4.1.2 依赖状态的操作类的不变性条件与后验条件约束了在对象上有哪些状态和状态转换是有效的。4.1.3 状态的所有权4.2 实例封闭将数据封装在对象内部,可以将数据的访问限制在对象的方法上,从而更容易确保线程原创 2020-06-23 23:25:26 · 179 阅读 · 0 评论 -
Java并发编程实战 第3章 对象的共享
3.1 可见性在没有同步的情况下,编译器、处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整。3.1.1 失效数据3.1.2 非原子的64位操作最低安全性:即使是失效值,但至少是之前的值,不是随机值。例外:非volatile类型的64位数值变量(long、double)。Java内存模型要求:变量的读取或写入都是原子操作,但是对非volatile的long和double变量,JVM允许将64位的读操作或写操作分解为两个32位的操作。当读取一个非volatile的long变量时,如果原创 2020-06-16 09:09:56 · 616 阅读 · 0 评论 -
Java并发编程实战 第2章 线程安全性
在构建稳健的并发程序时,必须正确地使用线程和锁。但这些终归只是一些机制,要编写线程安全的代码,核心在于要对状态访问操作进行管理,特别是对共享的和可变的状态的访问。原创 2020-06-10 01:23:19 · 177 阅读 · 0 评论