
JAVA - Thread
霁空
这个作者很懒,什么都没留下…
展开
-
Java多线程 - 线程池详解
1. 优势线程池的用处:原来是100个任务要有100个线程来执行任务,现在是100个任务我们只要几个线程就可以执行任务了。一个整合:ThreadPoolExecutor继承了AbstractExecutorService继承了ExecutorService继承了Executor。package com.roocon.thread.td4; import java.util.c...转载 2020-03-09 11:33:17 · 335 阅读 · 0 评论 -
Java多线程 - Fork/Join框架原理解析
1、概述Fork/Join Pool采用优良的设计、代码实现和硬件原子操作机制等多种思路保证其执行性能。其中包括(但不限于):计算资源共享、高性能队列、避免伪共享、工作窃取机制等。本文(以及后续文章)试图和读者一起分析JDK1.8中Fork/Join Pool的源代码实现,去理解Fork/Join Pool是怎样工作的。当然这里要说明一下,起初本人在决定阅读Fork/Join归并计算相关类的源...转载 2020-03-02 11:05:29 · 363 阅读 · 0 评论 -
Java多线程 - FutureTask使用及解析
1.概念FutureTask一个可取消的异步计算,FutureTask 实现了Future的基本方法,提供start cancel 操作,可以查询计算是否已经完成,并且可以获取计算的结果。结果只可以在计算完成之后获取,get方法会阻塞当计算没有完成的时候,一旦计算已经完成,那么计算就不能再次启动或是取消。2.使用场景FutureTask可用于异步获取执行结果或取消执行任务的场景。...转载 2020-02-29 20:41:23 · 629 阅读 · 0 评论 -
Java多线程 - Callable接口解析
1.接口的定义:public interface Callable<V> { V call() throws Exception; } 2.Callable和Runnable的异同先看下Runnable接口的定义public interface Runnable { public abstract void run();}相同...转载 2020-02-29 14:34:16 · 412 阅读 · 1 评论 -
Java多线程 - Exchanger原理和示例
1. 简介Exchanger——交换器,是JDK1.5时引入的一个同步器,从字面上就可以看出,这个类的主要作用是交换数据。Exchanger有点类似于CyclicBarrier,我们知道CyclicBarrier是一个栅栏,到达栅栏的线程需要等待其它一定数量的线程到达后,才能通过栅栏。Exchanger可以看成是一个双向栅栏,如下图:Thread1线程到达栅栏后,会首先观察有没...转载 2020-02-27 22:02:49 · 416 阅读 · 0 评论 -
Java多线程 - Semaphore信号量的原理和示例
1.简介Semaphore是一个计数信号量,它的本质是一个"共享锁"。信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。Semaphore的函数列表// 创建具有给定的许可数和非公平的公平设置的 Sem...转载 2020-02-26 23:21:43 · 308 阅读 · 0 评论 -
Java多线程 - CyclicBarrier原理
1.概述现实生活中我们经常会遇到这样的情景,在进行某个活动前需要等待人全部都齐了才开始。例如吃饭时要等全家人都上座了才动筷子,旅游时要等全部人都到齐了才出发,比赛时要等运动员都上场后才开始。在JUC包中为我们提供了一个同步工具类能够很好的模拟这类场景,它就是CyclicBarrier类。利用CyclicBarrier类可以实现一组线程相互等待,当所有线程都到达某个屏障点后再进行后续的操作...转载 2020-02-26 22:08:34 · 214 阅读 · 0 评论 -
Java多线程 - CountDownLatch原理
1.简介CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。CountDownLatch和CyclicBarrier的区别(01) CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。(02) CountDownLatch的计数器无法被重置;...转载 2020-02-26 21:40:07 · 614 阅读 · 1 评论 -
Java多线程 - InheritableThreadLocal类原理简介使用和父子线程传递数据详解
1.测试代码public class T25 { public static void main(String[] args) { //主线程中赋值 ThreadLocal<String> stringThreadLocal = new ThreadLocal<>(); InheritableThreadLoc...转载 2020-02-25 18:16:12 · 702 阅读 · 0 评论 -
Java多线程 - 深入解析ThreadLocal 详解、实现原理、使用场景方法以及内存泄漏防范
1.简介从名称看,ThreadLocal 也就是thread和local的组合,也就是一个thread有一个local的变量副本ThreadLocal提供了线程的本地副本,也就是说每个线程将会拥有一个自己独立的变量副本方法简洁干练,类信息以及方法列表如下2.示例在测试类中定义了一个ThreadLocal变量,用于保存Str...转载 2020-02-25 15:35:11 · 475 阅读 · 0 评论 -
Java多线程 - Java中的join方法原理详解
1. synchronized中的对象锁是线程的实例我们可以使用同步语句块的方式对需要同步的代码进行包裹。Object obj = new Object();synchronized(obj){obj.wait();//线程在这里等待}此时线程会在obj.wait()处等待,如果想继续执行,此时需要别的线程通过notify、notifyAll唤醒或者中断。但是如...转载 2020-02-25 10:31:54 · 517 阅读 · 0 评论 -
Java多线程 - Condition的实现原理
1.概述之前我们介绍AQS的时候说过,AQS的同步排队用了一个隐式的双向队列,同步队列的每个节点是一个AbstractQueuedSynchronizer.Node实例。Node的主要字段有:waitStatus:等待状态,所有的状态见下面的表格。 prev:前驱节点 next:后继节点 thread:当前节点代表的线程 nextWaiter:Node既可以作为同步队列节点使...转载 2020-02-23 22:57:23 · 198 阅读 · 0 评论 -
Java多线程 - wait、notify和notifyAll 详解
1、wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。2、wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关键字使用,即,一般在synchronized 同步代码块里使用 wait()、notify/notifyAll() 方法。3、 由于 wait()、notify/notifyAll() 在syn...转载 2020-02-23 19:22:24 · 382 阅读 · 0 评论 -
Java多线程 - ReentrantReadWriteLock读写锁详解
1.读写锁简介现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源;但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写的操作了。针对这种场景,JAVA的并发包提供了读写锁ReentrantReadWriteLock,它表示两个锁,一个是读操作相关的锁...转载 2020-02-23 18:40:43 · 263 阅读 · 0 评论 -
Java多线程 - ReentrantLock实际开发中的应用场景
1. 公平锁,线程排序执行,防饿死应用场景公平锁原则必须按照锁申请时间上先到先得的原则分配机制场景;1).实现逻辑 上(包括:软件中函数计算、业务先后流程;硬件中操作实现中顺序逻辑)的顺序排队机制的场景;软件场景:用户交互View中对用户输入结果分析类,分析过程后面算法依赖上一步结果的场景,例如:推荐算法实现[根据性别、年龄筛选]、阻塞队列的实现;硬件场景:需要先分析确认用户操作类型...转载 2020-02-23 15:59:22 · 2419 阅读 · 0 评论 -
Java多线程 - ReentrantLock的使用
1. 基本概念和使用可重入锁:也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。在JAVA中ReentrantLock 和synchronized 都是可重入锁;重入锁ReentrantLock 相对来说是synchronized、Object.wait()和Object.notify()方法的替代品(或者说是增强版),在JDK5.0的...转载 2020-02-23 15:27:04 · 360 阅读 · 0 评论 -
Java多线程 - CLH锁 、MCS锁
1.引文1.1 SMP(Symmetric Multi-Processor)对称多处理器结构,指服务器中多个CPU对称工作,每个CPU访问内存地址所需时间相同。其主要特征是共享,包含对CPU,内存,I/O等进行共享。SMP能够保证内存一致性,但这些共享的资源很可能成为性能瓶颈,随着CPU数量的增加,每个CPU都要访问相同的内存资源,可能导致内存访问冲突,可能会导致CPU资源的浪费...转载 2020-02-22 16:38:35 · 236 阅读 · 0 评论 -
Java多线程 - AQS详解
1.AQS产生背景几乎任一同步器都可以用来实现其他形式的同步器。例如,可以用可重入锁实现信号量或者用信号量实现可重入锁。但是,这样做带来的复杂性、开销及不灵活使j.u.c最多只能是一个二流工程,且缺乏吸引力。如果任何这样的构造方式不能在本质上比其他形式更简洁,那么开发者就不应该随意地选择其中的某个来构建另一个同步器。因此,JSR166基于AQS类建立了一个小框架,这个框架为构造同步器提供一种...转载 2020-02-22 16:08:38 · 220 阅读 · 0 评论 -
Java多线程 - 原子类操作详解
原子类的出现原因:当程序更新一个变量时,如果是多线程同时更新这个变量,可能得到的结果与期望值不同。比如:有一个变量i,A线程执行i+1,B线程也执行i+1,经过两个线程的操作后,变量i的值可能不是期望的3,而是2。这是因为,可能在A线程和B线程执行的时候拿到的i的值都是1,这就是线程不安全的更新操作,通常我们会使用synchronized来解决这个问题,synchronized能保证多线程不会...转载 2020-02-20 21:05:24 · 411 阅读 · 0 评论 -
Java的Unsafe类
1、Unsafe类介绍Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,同时也带来了指针的问题。过度的使用Unsafe类会使得出错的几率变大,因此Java官方并不建议使用的,官方文档也几乎没有。Oracle正在计划从Java 9中去掉Unsafe类,如果真是如此影响就太大了。2、Unsafe的主要功能我们先来看看Unsafe的初始化方法,这是一个单例模式:pri...转载 2020-02-19 22:15:06 · 172 阅读 · 0 评论 -
Java多线程 - 锁的详解
1. 自旋概念互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能 带来了很大的压力。同时,虚拟机的开发团队也注意到在许多应用上,共享数据的锁定状态只会持续很短的一段时间,为了这段时间去挂起和恢复线程并不值得。如 果物理机器有一个以上的处理器,能让两个或以上的线程同时并行执行,我们就可以让后面请求锁的那个线程“稍等一会”,但不放弃处理器...转载 2020-02-19 21:21:03 · 267 阅读 · 0 评论 -
Java多线程 - 锁的种类
简介:synchronized是一种独占式的重量级锁,在运行到同步方法或者同步代码块的时候,让程序的运行级别由用户态切换到内核态,把所有的线程挂起,通过操作系统的指令,去调度线程。这样会频繁出现程序运行状态的切换,线程的挂起和唤醒,会消耗系统资源,为了提高效率,引入了偏向锁、轻量级锁、尽量让多线程访问公共资源的时候,不进行程序运行状态的切换。1. 公平锁/非公平锁公平锁是指多个线程按照...转载 2020-02-19 20:50:42 · 298 阅读 · 0 评论 -
Java多线程 - synchronized的使用和原理
简介:synchronized是一种独占式的重量级锁,在运行到同步方法或者同步代码块的时候,让程序的运行级别由用户态切换到内核态,把所有的线程挂起,通过操作系统的指令,去调度线程。1.synchronized的使用 1、某个对象实例内此作用域内的synchronized锁 ,可以防止多个线程同时访问这个对象的synchronized方法一个对象有多个synchro...转载 2020-02-19 16:23:04 · 143 阅读 · 0 评论 -
Java多线程 - 多线程所存在的风险
1.线程安全性问题 死锁:哲学家就餐问题 假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。 哲学家从来不交...转载 2020-02-19 15:09:55 · 196 阅读 · 0 评论 -
Java多线程 - 线程状态以及各状态之间的转换
定义:线程:是指进程中的一个执行流程线程与进程的区别:每个进程都需要操作系统为其分配独立的内存地址空间,而同一进程中的所有线程在同一块地址空间中工作,这些线程可以共享同一块内存和系统资源。实现方式:Java实现多线程的方法有两种,一是继承Thread类、二是实现Runnable接口。线程状态及其之间的转换:当一个线程执行了start方法后,不代表这个线程就会立即被执行...转载 2020-02-19 13:31:24 · 407 阅读 · 0 评论 -
Java 中 Synchronized及其实现原理
Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:1、普通同步方法,锁是当前实例对象public class Synchronize...转载 2019-09-27 15:52:10 · 166 阅读 · 0 评论 -
Java 线程的状态转换
线程的状态转换详解:当一个线程执行了start方法后,不代表这个线程就会立即被执行,只代表这个线程处于可运行的状态,最终由OS的线程调度来决定哪个可运行状态下的线程被执行。 一个线程一次被选中执行是有时间限制的,这个时间段叫做CPU的时间片,当时间片用完但线程还没有结束时,这个线程又会变为可运行状态,等待OS的再次调度;在运行的线程里执行Thread.yeild()方法同样可以使当...转载 2019-09-26 16:02:25 · 92 阅读 · 0 评论 -
Java多线程 - 线程的八种创建方式
1. 继承 Thread 类,然后调用 start 方法。class SampleThread extends Thread { //重写run方法,线程运行后,跑的就是run方法 public void run(){ //System.out.println(""); } public static void main(String[] ...转载 2019-09-26 15:50:38 · 124 阅读 · 0 评论