队列同步器的作用 在多线程应用中,关键在于对状态依赖的管理以及对线程状态的管理。 因为资源不是无限的,如I/O资源、内存资源、CPU资源等,需要对线程进行控制,获取不到资源的线程需要进行阻塞或者挂起,这就引入了队列同步器中的一个关键属性:队列,获取不到资源的线程需要阻塞,然后在队列中等待唤醒。 状态依赖管理 对于加锁有前验的条件验证,也就是状态依赖。如:一个阻塞队列,put的时候队列不能为满,get的时候队列不......
线程池 Executor框架 基于Executor框架,通过消费者-生产者模式,把任务的提交和执行分离。 123public interface Executor { void execute(Runnable command);} 在Execute框架中,线程不是执行主要的抽象,任务才是。 执行策略 在什么线程中执行任务 任务按照什么顺序执行(FIFO、LIFO、优先级) 有多少个......
Lock Lock接口的实现必须提供和内置锁相同的内存可见性语义,但在加锁语义、调度算法、顺序保证和性能上可以不同。 ReentrantLock ReentrantLock 实现了与 synchronized 相同的可重入锁实现,并且在 java1.6 之后性能相差无几。对比 synchronized ,ReentrantLock 实现了可定时、可轮询、可中断的获取锁操作。 注意点:使用 ReentrantLo......
什么是可伸缩性? 当硬件性能提升,如cpu提升、内存提升、IO性能提升时,应用程序的处理能力是否会跟随硬件有相应的增加。 如何对可伸缩性进行优化的基准 开发中需要针对具体需求进行定制,如何以以测试为基准进行优化。 多线程的可伸缩性的限制 在所有的并发程度中都会有一部分的串行化的任务,如I/O阻塞、对阻塞队列进行读取和写入等 JVM对锁的优化 锁消除,基于逃逸分析可以把没有逃逸出栈的对象中的锁消除。 锁粗化,将......
线程在相互等待 死锁 获取锁顺序导致死锁 可以通过 System.identityHashCode() 方法获取锁对象的hash,然后通过hash值进行判断,保证每次获取锁的顺序都是一致的,避免因获取锁顺序导致死锁 开放调用 在获取了锁的方法中调用一个需要获取另一个锁的方法,可能会导致死锁,可以通过降低锁的粒度,使得方法调用同步代码块不包含需要获取锁的方法调用。保证开放调用。 定时锁 获取锁时设置超......
Java的线程安全和锁优化 线程安全 在Java中或者说在Jvm实现中,线程安全是一个相对的概念,某个对象在单独使用某个操作时是线程安全的,但在某些操作顺序却不是线程安全,需要额外的同步。该节将介绍线程安全的概念和在Java中的实现。 Java语言中的线程安全 不可变 final类型的基本类型,在初始化时,如果没有发生this引用逃逸正确地初始化,在以后的使用中值不会变更,是线程安全的;对象行为不会对自身状态变......
Java线程池 什么是线程池? 线程池负责维护一个或多个线程的运行,让我们在实际的项目编码中不用自己编写维护线程的逻辑,简化编程,提高代码的鲁棒性,易读性。 线程池的创建方法 通过java.util.concurrent.ThreadPoolExecutor创建 构造方法 ThreadPoolExecutor构造方法 12345678910 public ThreadPoolExecutor(int co......