![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java并发编程
乔布斯基
请叫我乔布斯基
展开
-
java并发编程实战-线程池的使用2
1,线程池ThreadPoolExecutor 1.1,如果某个线程的空闲时间超过了存或时间,那么将被标记为可回收的,并且当线程池的当前大小超过了基本大小时,这个线程将被终止 1.2,通过调节线程池的基本大小和存或时间,可以帮助线程池回收空闲线程占有的资源。 1.3,newFixedThreadPool工厂方法将线程池基本大小和最大大小设置为参数中的指定值,而且创建的线程池超时(原创 2017-07-15 22:13:13 · 336 阅读 · 0 评论 -
java并发编程实战-线程池的使用1
1,Executor框架可以将任务的提交与任务的执行策略解耦开来,并且为制定和修改执行策略都提供了相当大的灵活性,但并非所有的任务都能够使用所有的执行策略。有些类型任务需要明确地指定执行策略:依赖性任务,使用线程封闭机制的任务,对响应时间敏感的任务,使用ThreadLocal的任务。 1.1,依赖于其他任务的任务,要求线程池足够大,从而确保他们依赖的任务不会被放入等待队列中或被拒绝。原创 2017-07-15 18:01:23 · 510 阅读 · 0 评论 -
java并发编程实战-避免活跃性危险
1,死锁的避免与诊断 1.1,在使用细粒度锁的程序中,可以通过使用一种两阶段策略来检查代码中的死锁: 1.1.1,首先,找出在什么地方将获取多个锁,确保他们在整个程序中获取锁的顺序都保持一致 1.1.2,尽可能地使用开放调用 1.2,使用Lock类中的定时tryLock功能来替代内置锁机制,如果锁等待时间超过超时时间,那么tryLock会返回一个失败信息。可以通过锁原创 2017-07-18 21:50:29 · 469 阅读 · 0 评论 -
java并发编程实战-性能与可伸缩性1
1,要想通过并发来获得更好的性能,需要努力做好两件事:更有效地利用现有处理资源,以及在出现新的处理资源时使程序尽可能地利用这些新的资源。2,应用程序性能可以采用多个指标来衡量:服务时间,延迟时间,吞吐率,效率,可伸缩性以及容量等3,可伸缩性指的是:当增加计算资源时(如:CPU,内存,存储容量或者I/O宽带等),程序的吞吐量或者处理能力能相应地增加4,避免不成熟的优化,首先使程序正确,然原创 2017-07-19 22:54:51 · 397 阅读 · 0 评论 -
java并发编程实战-性能与可伸缩性2
1,在并发程序中,对可伸缩性的最主要威胁就是独占方式的资源锁2,有两个因素影响锁上发生竞争的可能性:锁的请求频率,每次持有锁的时间3,缩小锁的范围(快进快出) 3.1,通过缩小方法中锁的作用范围,能极大地减少在持有锁时需要执行的指令数量。根据Amdahl定律,这样消除了限制可伸缩的一个因素,因为串行代码的总量减少了 3.2,在实际情况中,仅当可以将一些大量的计算或阻塞操作从同步原创 2017-07-22 12:18:00 · 360 阅读 · 0 评论 -
java并发编程实战-并发程序的测试
1,并发测试大致分为两类:安全性测试与活跃性测试。安全性指的是“不发生任何错误的行为”,而活跃性定义为某个良好的行为终究会发生。2,与活跃性测试相关的时性能测试,包括:吞吐量,响应性,可伸缩性。3,正确性测试 3.1,首先要找出需要检查的不变性条件和后验条件 3.2,基本的单元测试,和串行测试类似 3.3,对阻塞操作的测试。一种简单的方式是使用中断,启动一个阻塞操作,等到原创 2017-07-22 20:52:58 · 698 阅读 · 0 评论 -
java并发编程实战-显式锁
1,ReentrantLock不是替代内置加锁的方法,而是当内置加锁不适用时,作为一种可选的高级功能,如:可定时的、可轮询的,与可中断的锁获取操作,公平队列,以及非块结构的锁。一般应该优先使用synchronized。2,Lock提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作,在Lock的实现中必须提供与内部锁相同的内存可见性语义,但在加锁语义、调度算法、顺序保证以及性能特性等方面原创 2017-07-23 11:55:28 · 280 阅读 · 0 评论 -
java并发编程实战-构建自定义的同步工具
1,状态依赖性的管理:在单线程程序中,如果某一个基于状态的前提条件未得到满足,则这个条件将永远无法成真,可是,在并发程序中,基于状态的条件可能由于其他线程的操作而改变2,条件队列:他使得一组线程能够通过某种方式来等待特定的条件变为真。传统队列的元素是一个一个数据,而条件队列中的元素是一个一个正在等待相关条件的线程3,Object.wait会自动释放锁,并请求操作系统挂起当前线程,从而使其他原创 2017-07-23 16:21:09 · 318 阅读 · 0 评论 -
java并发编程实战-原子变量与非阻塞同步机制
1,近年来,在并发算法领域的大多数研究都侧重于非阻塞算法,这种算法用底层的原子机器指令(例如比较并交换指令)代替锁来确保数据在并发访问中的一致性。2,与基于锁的方案相比,非阻塞算法在设计和实现上都要复杂得多,但它们在可伸缩性和活跃性上却拥有巨大的优势。3,锁的劣势 3.1,当有多个线程同时请求锁时,JVM需要借助操作系统的功能,将线程挂起并且在稍后恢复运行。当锁上存在着激烈的竞争时,原创 2017-07-24 22:30:18 · 336 阅读 · 0 评论 -
java并发编程实战-Java内存模型
1,JMM(Java类型模型)规定了JVM必须遵循的一组最小保证,这组保证规定了对变量的写入操作在何时将对于其他线程可见。 1.1,平台的内存模型:在共享内存的多处理器体系架构中,每个处理器都拥有自己的缓存,并且定期地与主内存进行协调。要想确保每个处理器都能在任意时刻知道其他处理器正在进行的工作,将需要非常大的开销。Java还提供了自己的内存模型,并且JVM通过在适当的位置插入内存栅栏来屏蔽原创 2017-07-29 18:29:58 · 304 阅读 · 0 评论 -
java并发编程实战-CyclicBarrier和FutureTask使用
import java.util.concurrent.Callable;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.FutureTask;public class FutureTest { public static void main(String[] args) { new Fut原创 2017-07-27 20:26:47 · 745 阅读 · 0 评论 -
java并发编程实战-取消与关闭3
1,处理非正常的线程终止1.1,导致线程提前死亡的主要原因是RuntimeException。它们不会在调用栈中逐层传递,而是默认地在控制台中输出堆栈追踪信息,并终止线程。1.2,在任务处理线程的生命周期中,将通过某种抽象机制来调用许多未知代码,我们应该对这些线程中执行的代码能否表现出正确的行为保持怀疑,应该在try-catch快或者try-finally快中调用这些任务,确保框架能够知道原创 2017-07-13 21:52:16 · 347 阅读 · 0 评论 -
java并发编程实战-取消与关闭2
1,在中断线程之前,应该了解他的中断策略,除非你清除线程的中断策略,否则不要中断线程。2,当尝试取消某个任务时,不宜直接中断线程池,因为你不知道当中断请求到达时正在运行什么任务,只能通过任务的Future来实现取消。3,Future拥有一个cancel方法,在一下情况下可以调用该函数将参数置为true:3.1,执行任务的线程是由标准的Executor创建的3.2,它实现了一种中断策原创 2017-07-12 23:14:00 · 318 阅读 · 0 评论 -
java并发编程实战-取消与关闭1
1,Java没有提供任何机制来安全的终止线程,但它提供了中断(Interruption),这是一种协作机制,能够使一个线程终止另一个线程的当前工作2,如果外部代码能在某个操作正常完成之前将其置入“完成”状态,那么这个操作就可以称为可取消的(Cancellable)3,“已请求取消”(Cancellation Requested)标志,任务会定期查看该标志,如果设置了这个标志,则任务提前结束原创 2017-07-09 21:33:33 · 371 阅读 · 0 评论 -
java并发编程实战-线程安全性
1,如果当多个线程访问同一个可变的状态变量时,没有使用适合的同步,那么程序就会出错。有三种方式可以修复这个问题a,不在线程之间共享该变量b,将状态变量修改为不可变的变量c,在访问状态变量时使用同步2,无状态对象一定是线程安全的3,在实际情况中,应尽可能地使用现有的线程安全对象(例如:AcomicLong)来管理计数器的状态。4,由于锁能使其保护的代码路径以串行的形式来访问,原创 2017-06-25 17:51:01 · 482 阅读 · 0 评论 -
java并发编程实战-对象的共享
1,发布与溢出1.1,发布指的是使对象能够在当前作用域之外的代码中使用1.2,溢出指的是某个不应该发布的对象被发布了1.3,发布一个对象有几种方法:1.3.1,将对象的引用保存到一个公有的静态变量中1.3.2,当把一个对象传递给某个外部方法时,就相当于发布了这个对象。1.3.3,当发布了一个类的内部类实例,就会发布该对象1.4,安全对象构造过程1.4.1,在在构造函原创 2017-07-02 18:20:22 · 355 阅读 · 0 评论 -
java并发编程实战-对象的组合
1,设计线程安全的类 1.1,设计线程安全的类的过程中,需要包括以下三个基本要素: 1.1.1,找出构成对象状态的所有变量 1.1.2,找出约束状态变量的不变形条件 1.1.3,建立对象状态的并发访问管理策略 1.2,仅包含基本类型域的对象,其状态就是这些域构成的n元组;如果对象的域中引用了其他对象,那么该对象的状态还包括引用对象的域。 1.3,同步原创 2017-07-03 23:02:14 · 786 阅读 · 0 评论 -
java并发编程实战-基础构建模块1
1,委托是创建线程安全类的一个最有效的策略,只需让现有的线程安全类管理所有的状态即可。2,同步容器类包括Vector和Hashtable。3,同步容器是线程安全的类,并不保证在程序运行中一定是正常的。例如迭代不可靠问题:在迭代中如果有其他线程删除了容器中的元素,那么就可能会导致数组越界异常,这异常并不意味着容器不是线程安全的,容器的状态仍然是有效的,而且抛出的数组越界异常也与其规范保持一致原创 2017-07-05 22:28:32 · 386 阅读 · 0 评论 -
java并发编程实战-基础构建模块2
1,通过并发容器来替代同步容器,可以极大地提高伸缩性并降低风险2,ConcurrentHashMap 2.1,用来替代同步的Map,同Map一样也是基于散列的Map。 2.2,但是它使用一种更加细粒度的加锁机制(分段锁LockStriping)来实现大程度的共享。 2.3,它允许多个线程同时对容器进行读写操作,在并发访问环境下实现更高的吞吐量,在单线程中也只损失非常小的性能,原创 2017-07-06 22:31:17 · 326 阅读 · 0 评论 -
java并发编程实战-基础构建模块3
1,阻塞队列可以作为同步工具类,其他类型的同步工具类还包括信号量(Semaphore)、栅栏(Barrier)以及闭锁(Latch)。2,所有的同步工具类都包含了一些特定的结构化属性:他们封装了一些状态,这些状态将决定执行同步工具类的线程是继续执行还是等待,此外还提供了一些方法对状态进行操作,以及另外一些方法用于高效地等待同步工具类进入到预期状态3,闭锁 3.1,闭锁是一种同步工具类原创 2017-07-07 22:18:54 · 311 阅读 · 0 评论 -
java并发编程实战-基础知识总结
第一部分小结1,可变状态至关重要。所有的并发问题都可以归结为如何协调对并发状态的访问,可变状态越少就越容易确保线程安全性。无状态对象永远是线程安全的。2,尽量将域申明为final类型,除非需要他们是可变的。3,不可变对象一定是线程安全的。不可变对象能极大地降低并发编程的复杂性,他们更为简单而且安全,可以任意共享而且无需使用加锁或保护复制等机制。4,封装有助于管理复杂性,将数据封装在原创 2017-07-08 13:10:20 · 277 阅读 · 0 评论 -
java并发编程实战-构建高效且可伸缩的结果缓存
构建高效且可伸缩的结果缓存1,缓存在服务器应用程序中是一个非常重要的组件。2,一下讲解一个高效且可伸缩的缓存示例代码如下public class CacheSample { /* * 缓存类容器 * 1,选择线程安全的ConcurrentMap,它提供了并发读写的线程安全,以及“先检查再执行”这样的原子操作putIfAbsent * 2,选择Future,避免直接存储原创 2017-07-08 14:41:13 · 288 阅读 · 0 评论 -
java并发编程实战-任务执行
1,在理想情况下,各个任务之间是相互独立的,任务并不依赖于其他任务的状态,结果或者边界效应。独立有助于实现并发。2,大多数服务器应用程序都提供一种自然的任务边界选择方式,以独立的客户请求为边界,这样既可以实现任务的独立性,又可以实现合理的任务规模。3,应用程序中可以通过多种策略来调度任务,3.1,最简单的策略就是单个线程中串行地执行各项任务,这种策略无法提供高吞吐率或快速响应性,同时服原创 2017-07-09 13:11:04 · 330 阅读 · 0 评论 -
java并发编程实战-构建高效的并行计算
构建高效的并行计算1,在程序开发中我们经常会对异构的任务进行并行化处理,例如一个线程负责数据下载,另一个线程响应ui操作2,但是有时候多个异构的任务并行并不能保证程序的效率,例如数据下载需要1秒,数据计算需要10秒,那么将这两个任务并行处理也只能提高9%的效率3,只有当大量相互独立且同构的任务可以并行处理时,才能体现出将程序的工作负载分配到多个任务中带来的真正性能提升示例代码如下原创 2017-07-09 16:02:03 · 556 阅读 · 1 评论