Java多线程
一只老风铃
欣于所遇,暂得于己,快然自足。
展开
-
Java多线程 ThreadGroup线程组
线程组ThreadGroup——线程的集合 ——树状结构 大线程组可以包含小线程组——可以通过enumerate方法遍历组内的线程,执行操作——可管理组内线程,但效率低下,粒度不够精细——任务分配与执行过程耦合——线程重复创建关闭,开销较大 案例演示 Searcher类实现Runnable接口 重写run()方法 Result是一个简单的bean类...原创 2019-02-18 10:40:46 · 774 阅读 · 0 评论 -
深入JVM 硬件的效率与一致性
让计算机并发执行若干个运算任务与更充分利用计算机的效能之间的因果关系,看似顺理成章,实际它们之间关系远远没有想象的简单,其中一个重要的复杂性来源于绝大多数的运算任务不可能单靠 处理器计算完成,那么处理器与内存的交互,如读取运算数据,存储运算结果,类似的IO操作是很难消除的(无法仅仅依靠寄存器完成所有计算任务)由于计算机的存储设备与处理器之间的速度代沟,所以现代计算机系统不得不加入一层读写速度尽...原创 2019-03-13 17:29:21 · 274 阅读 · 0 评论 -
深入JVM 高并发-锁
——自旋锁与自适应自旋互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程需要切换到内核态来完成,这些操作给系统的并发性能带来很大的压力。但是在许多应用上,共享数据的锁定状态只会持续一小段时间,为了这段时间去挂起和恢复线程不值得,如果物理机器有一个以上的处理器,能让2个或以上线程同时并行执行,就可以让后面请求锁的线程稍等一下,但不放弃处理器的执行时间,看持有锁的线程是否很快释放锁,为了让...原创 2019-03-18 15:22:11 · 400 阅读 · 0 评论 -
深入JVM 线程安全的实现
——互斥同步互斥同步(Mutual Synchronization)是常见的一种并发正确性保障手段,同步是指多线程并发访问共享数据时,保证共享数据同一时刻只能被一个(或一些 信号量)线程使用。而互斥是同步的一种手段,临界区、互斥量、信号量都是主要的互斥实现手段,互斥是手段,同步是结果,互斥是方法,同步是目的在Java语言层面,最基本的互斥同步手段就是synchronized关键字,sync...原创 2019-03-17 14:18:48 · 205 阅读 · 0 评论 -
深入JVM 线程安全分级
线程安全:当多个线程访问一个对象,如果不需要考虑这些线程在运行时环境的调度和执行,也不需要额外的同步,或者调用方进行协调,调用执行的结果总是正确的,那么这个对象是线程安全的在Java中按照安全等级可以将共享数据划分成5类——不可变不可变的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要采用任何线程安全保障,final关键字:只要一个不可变对象被创建出来,那其外部的可...原创 2019-03-17 13:29:29 · 160 阅读 · 0 评论 -
深入JVM 先行发生原则
Java内存模型有序性可以依靠volatile和synchronized关键字来完成,但实际进行Java程序设计时却并没有过多注意这一点,因为Java语言存在一个先行发生原则:happens-before原则。这个原则用于判断数据是否存在竞争,线程是否安全的判断依据。所谓先行原则,指的是两项操作之间的偏序关系,如果说操作A先行发生于操作B ,即操作B发生之前,操作A产生的影响能被操作B观察到,...原创 2019-03-17 12:48:47 · 391 阅读 · 0 评论 -
Java多线程 happen-before原则
happens-before原则——从jdk5开始,基于happens-before的概念来阐述操作之间的内存可见性。happens-before定义:——Two actions can be ordered by a happens-before relationship. If one action happens-before another, then the first is ...原创 2019-02-20 13:30:57 · 413 阅读 · 0 评论 -
Java多线程 interrupt中断阻塞
interrupt()方法 ——interrupt()方法并不是中断线程,而是中断阻塞状态,或者将线程的[中断标志位]置为true。——对于未阻塞的线程,interrupt()只是造成[中断标志位]=true,线程本身运行状态不受影响。——对于阻塞的线程,interrupt()会中断阻塞状态,使其转换成非阻塞状态,并清除[中断标志位]。——造成阻塞状态的情况有:sleep...原创 2019-02-20 13:29:36 · 2732 阅读 · 3 评论 -
Java多线程 Join线程插队
join()方法Waits for this thread to die.即:等待这个线程结束。 1 程序中有两个线程:[线程A] = threadA、[线程B]=threadB 2 在[线程A]的run()方法中,调用了threadB.join() 3 则[线程A]会在此段代码出,暂停后续代码的调用,等待[线程B]执行结束。 4 [线程B]执行结束之后...原创 2019-02-20 13:29:48 · 368 阅读 · 0 评论 -
Java多线程 Concurrent并发包——CountDownLatch
CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程 需要 启动所有的框架服务之后再向后执行。CountDownLatch是通过一个计数器来实现的计数器的初始值为线程的数量。 每当一个线程完...原创 2019-02-19 00:58:01 · 293 阅读 · 0 评论 -
Java多线程 Concurrent并发包——Semaphore
Semaphore 信号量位于java.lang.concurrent包下——计数器大于0 表示可以使用的资源数量 小于等于0不可使用——可用于设置多个并发量,例如限制10个访问——acquire 获取 release 释放比Lock更进一步 可以控制多个线程同时访问关键区 实例演示:抢车位10辆车同时到达停车场,但是只有5个车位,模拟多辆车停车,开走等流程采...原创 2019-02-19 00:14:37 · 310 阅读 · 0 评论 -
Java多线程 Concurrent并发包——Lock
传统的线程协作 Thread 、Executor、 ForkJoin——线程任务启动-》执行-》结束——线程间缺乏协作Synchronized同步——同时限定一个线程进入关键区 性能损失较大Lock——java.lang.concurrent.lock包提供同步的效果——实现更为复杂的临界区结构——tryLock方法预判锁是否空闲——允许读写锁分离 符合 ...原创 2019-02-19 00:14:48 · 939 阅读 · 0 评论 -
Java多线程 并发数据结构的安全性
在多线程的任务执行中,常用的Java数据结构是线程不安全的——ArrayList HashMap HashSet等 非同步——多个线程可能同时读写,出现数据错误或抛出异常传统Vector Hashtable同步集合 采用synchronized方式 性能低下并发数据结构:数据添加 删除——阻塞式集合:当集合为空或满时,等待阻塞——非阻塞式集合:当集合为空为满时,不等待,返回...原创 2019-02-18 21:52:33 · 952 阅读 · 0 评论 -
Java多线程 生产者消费者问题
多线程经典问题:给定一个大小确定的仓库,有多个生产者和消费者当仓库不为空时,消费者可以消费其中的产品当仓库不为满时,生产者可以向其中放入产品 解决思路:为了避免出现数据不一致性,同一时间只允许一个线程执行读写操作采用实现Runnable接口的方式——wait notify notifyAll 关键字用于阻塞 唤醒线程——Interrupt 将向其它线程发送I...原创 2019-02-18 21:18:46 · 678 阅读 · 0 评论 -
Java多线程 volatile synchronized关键字
多线程——一个程序可以包括多个子任务,可串行 / 并行——每个子任务可称为一个线程——如果一个子任务阻塞,程序可将CPU调度另一个子任务工作,确保CPU时间片获取率和使用时间 相较于多进程优势——线程间共享数据——线程间通讯更为高效——线程是轻量级的,切换更为方便——多个线程更易管理 Java多线程方法——java.lang.Thread ...原创 2019-02-18 10:41:18 · 188 阅读 · 1 评论 -
Java多线程 ForkJoin并发框架
Fork-Join多线程并发框架——JDK7提供的一种新的并发框架:分解、合并 基于分治递归的思想——适用于整体任务量不确定,但单个最小任务确定的情况使用 ForkJoin并发框架的主要类包括:ForkJoinPool:ForkJoin线程池,实现了ExecutorService接口和工作窃取算法,用于线程调度与管理。ForkJoinTask:ForkJoin任务,...原创 2019-02-18 10:41:09 · 405 阅读 · 0 评论 -
Java多线程 Executor并发框架
从JDK5开始提供Executor FrameWork (java.util.concurrent)——分离任务的创建和执行者的创建——线程可重复利用,降低new线程带来的消耗共享线程池——创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率——预先创建好一定的Thread放于池中,当要使用时可直接向池中获取——线程并发数量过多,抢占系统资源从...原创 2019-02-18 10:40:57 · 1201 阅读 · 0 评论 -
深入JVM Java内存模型
Java虚拟机规范试图定义一种Java内存模型来屏蔽掉各种硬件操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致性的内存访问效果。而相对而言,C C++是直接使用物理硬件和操作系统的内存模型,因此在不同的平台上存在差异,可能导致程序在不同平台执行效果不同,存在耦合的弊端定义Java内存模型需要考虑得当,必须足够严谨,才能让Java的并发内存访问不出错,但是,也必须足够宽松,使...原创 2019-03-13 17:47:19 · 284 阅读 · 0 评论