队列同步器的作用 在多线程应用中,关键在于对状态依赖的管理以及对线程状态的管理。 因为资源不是无限的,如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值进行判断,保证每次获取锁的顺序都是一致的,避免因获取锁顺序导致死锁 开放调用 在获取了锁的方法中调用一个需要获取另一个锁的方法,可能会导致死锁,可以通过降低锁的粒度,使得方法调用同步代码块不包含需要获取锁的方法调用。保证开放调用。 定时锁 获取锁时设置超......
指定堆大小 12345//指定堆最大-XX:Xmx1024m//指定堆初始大小-XX:Xms1024m Java方法栈 指定线程的栈最大空间 12//默认256K-XX:Xss128K 影响GC因素: 局部变量表槽位复用 在方法体中声明的变量都会在局部变量表中,如果超过其作用域,则会被之后声明的变量复用,如果是引用类型,则会失去引用,被GC。但如果只是超过作用域但是没有被其他变量复用,则不会失去引用。 栈内分配......
Java的线程安全和锁优化 线程安全 在Java中或者说在Jvm实现中,线程安全是一个相对的概念,某个对象在单独使用某个操作时是线程安全的,但在某些操作顺序却不是线程安全,需要额外的同步。该节将介绍线程安全的概念和在Java中的实现。 Java语言中的线程安全 不可变 final类型的基本类型,在初始化时,如果没有发生this引用逃逸正确地初始化,在以后的使用中值不会变更,是线程安全的;对象行为不会对自身状态变......
Java与线程模型 线程的实现 内核线程实现 定义:内核线程(Kernel-Level Thread,KLT):直接由操作系统内核支持的线程,由内核来完成线程切换 优势:实现依赖内核,实现简单 劣势:部分操作需要从用户态切换到内核态,开销较大 用户线程实现 定义 广义:一个线程不是内核线程,就可以认为是用户线程,在这个定义上讲,轻量级进程也是用户线程,但是轻量级进程的实现是建立在内核之上的......
Java线程池 什么是线程池? 线程池负责维护一个或多个线程的运行,让我们在实际的项目编码中不用自己编写维护线程的逻辑,简化编程,提高代码的鲁棒性,易读性。 线程池的创建方法 通过java.util.concurrent.ThreadPoolExecutor创建 构造方法 ThreadPoolExecutor构造方法 12345678910 public ThreadPoolExecutor(int co......
Jvm调优的目的 为使得jvm虚拟机在不同硬件配置的机器上获取更好的性能,以及更好的稳定性,调整默认的jvm可以使得我们的程序在性能上有所提升。如: 如项目中有大量的新对象的寿命很短,可以适当把新生代的大小调整到合适的大小。 调整新生代进入老年代的阈值,使得避免新生代多次复制GC一些大概率会进入老年代的对象。 注意:JVM调优需要针对当前项目的特点进行调整,最好在调优前使用分析插件分析程序在运行时的内存......