多线程
五山口老法师
腾讯后台开发工程师
展开
-
JAVA多线程:线程创建过程以及生命周期总结
1)如果所有的前台线程死亡,那么后台线程也会自动死亡。2)一旦线程A调用了线程B的join()方法,那么线程B将会启动执行。此时,线程A会等待线程B执行完成后再继续执行。应用场景: 可以将大任务分而治之,同时又保证了正确的处理顺序!3)当你改变了一个线程的优先级,那么由这个线程创建的子线程的优先级默认都是这个线程的优先级。默认每个线程的优先级都和创建它的父线程优先级相同。...原创 2018-11-12 21:00:40 · 227 阅读 · 0 评论 -
并发编程:幂等性
一、幂等性概念在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“getUsername()和setTrue()”函数就是一个幂等函数. 更复杂的操作幂等保证是利用唯一交易号(流水号)实现.我的理解:幂等就是一个操作,不...原创 2019-01-08 17:56:22 · 198 阅读 · 0 评论 -
多线程:Callable
Callable接口提供一个call()方法可以作为线程执行体。与run()方法不同的是:call()方法具有返回值!还可以声明异常!创建并启动有返回值的线程步骤如下:1)创建Callable的实现类,并实现call()方法。JAVA8开始可以使用lambda函数创建callable对象。FutureTask<Integer> task = new FutureTas...原创 2019-01-08 23:29:51 · 376 阅读 · 0 评论 -
多线程:Vector是线程安全的吗
线程安全,在java的多并发编程中是重要概念,意思是,多个线程同时操作一个对象,在各种不同情况下,都不会造成不同的后果。一个经典问题,Vector到底是不是线程安全的? 很多人都会回答,是,vector是线程安全的。诚然,不止是很多IT教材上是这么写的,就连JDK的作者写的注释也是这么说的。如下图(图为 JDK中Vector的源代码):注释中,红框标记的部分写着:如果你不需要线程安...原创 2019-01-14 17:06:18 · 3472 阅读 · 0 评论 -
多线程:interrupted、isinterrupted区别
interrupted()是静态方法:内部实现是调用的当前线程的isInterrupted(),并且会重置当前线程的中断状态isInterrupted()是实例方法,是调用该方法的对象所表示的那个线程的isInterrupted(),不会重置当前线程的中断状态结论:interrupt方法是用于中断线程的,调用该方法的线程的状态将被置为"中断"状态。注意:线程中断仅仅是设置线程的中断状态位,...原创 2019-01-14 19:56:16 · 423 阅读 · 0 评论 -
多线程:为什么wait()需要放在循环中?
举个栗子:synchronized (monitor) { // 判断条件谓词是否得到满足 while(!locked) { // 等待唤醒 monitor.wait(); } // 处理其他的业务逻辑}那为什么非要while判断,而不采用if判断呢?如下:synchronized (monitor) { ...原创 2019-01-14 20:06:01 · 846 阅读 · 0 评论 -
多线程:保证三个线程依次按顺序执行?newSingleThreadExecutor!!!
newSingleThreadExecutor 这个线程池,保证线程里面的任务依次执行,这让我发现了新大陆,立马实践了一下,发现不负所望;public class TestJoin { public static void main(String[] args) throws InterruptedException { final Thread t1 = new...原创 2019-01-14 20:45:57 · 2740 阅读 · 1 评论 -
多线程:当你提交任务时,线程队列已经满了,这时会发生什么?
首先我调用Executors创建的线程池出来的对象是ThreadPoolExecutor,ScheduledThreadPoolExecutor,DelegatedExecutorService这三个类中的一个! 而ScheduledThreadPoolExecutor是ThreadPoolExecutor的子类, DelegatedExecutorService是对ExecutorServ...原创 2019-01-14 21:07:21 · 13777 阅读 · 6 评论 -
多线程:Immutable对象?如何创建Immutable对象?
那么什么是immutable objects?什么又是mutable Objects呢?immutable Objects就是那些一旦被创建,它们的状态就不能被改变的Objects,每次对他们的改变都是产生了新的immutable的对象,而mutable Objects就是那些创建后,状态可以被改变的Objects.举个例子:String和StringBuilder,String是im...原创 2019-01-14 21:29:41 · 329 阅读 · 0 评论 -
多线程:happens-before 先行发生原则
下面就来具体介绍下happens-before原则(先行发生原则):这8条规则中,前4条规则是比较重要的,后4条规则都是显而易见的。 下面我们来解释一下前4条规则: 对于程序次序规则来说,我的理解就是一段程序代码的执行在单个线程中看起来是有序的。注意,虽然这条规则中提到“书写在前面的操作先行发生于书写在后面的操作”,这个应该是程序看起来执行的顺序是按照代码顺序执行的,因为虚拟机...原创 2019-02-18 22:54:27 · 237 阅读 · 0 评论 -
多线程:AQS源码分析
AQS 源码分析 概述Java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchronized还是存在一些缺陷的:虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基于JVM机制),但是它却缺少了获取锁与释放锁的可操作性,可中断、超时获取锁,且它为...原创 2019-02-25 13:39:54 · 195 阅读 · 0 评论 -
多线程:AQS的一些心得
AQS作为JUC并发组件实现的核心。全称是AbstructQueuedSynchronizer,也就是同步队列器。其内部实现主要的是一个state状态标识和基于FIFO一个同步队列。这个状态标识表明当前的资源是否是可以争取的,当state=0是,表示资源没有加锁;当state>0时,表示资源加锁。关于这个队列,有几个属性:1)队列是基于双向链表的,因此具有定制的节点结构...原创 2019-02-25 16:04:54 · 325 阅读 · 0 评论 -
多线程:多线程优缺点、应用场景
首先说下多线程出现的原因:为了解决负载均衡问题,充分利用CPU资源.为了提高CPU的使用率,采用多线程的方式去同时完成几件事情而不互相干扰.为了处理大量的IO操作(IO密集时,cpu利用率会下降)时或处理的情况需要花费大量的时间等等,比如:读写文件,视频图像的采集,处理,显示,保存等多线程的好处:0.提高CPU的利用率。从磁盘上读取文件的时候,大多数的CPU时间都会花费在等待磁盘来读取...原创 2019-03-10 23:35:25 · 2851 阅读 · 0 评论 -
多线程:同步和异步的优缺点比较
异步的使用场景:1、不涉及共享资源,或对共享资源只读,即非互斥操作2、没有时序上的严格关系3、不需要原子操作,或可以通过其他方式控制原子性4、常用于IO操作等耗时操作,因为比较影响客户体验和使用性能5、不影响主线程逻辑同步的使用场景:不使用异步的时候同步的好处:1、同步流程对结果处理通常更为简单,可以就近处理。2、同步流程对结果的处理始终和前文保持在一个上下文内...原创 2019-03-10 23:40:34 · 4284 阅读 · 5 评论 -
JVM:锁机制
理解锁的基础知识如果想要透彻的理解java锁的来龙去脉,需要先了解以下基础知识。基础知识之一:锁的类型锁从宏观上分类,分为悲观锁与乐观锁。乐观锁乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一...原创 2019-03-22 11:36:08 · 895 阅读 · 1 评论 -
多线程:一个线程在运行时发生异常会怎么样?
Java中Throwable分为Exception和Error:出现Error的情况下,程序会停止运行。Exception分为RuntimeException和非运行时异常。非运行时异常必须处理,比如thread中sleep()时,必须处理InterruptedException异常,才能通过编译。而RuntimeException可以处理也可以不处理,因为编译并不能检测该类异常,比如...原创 2019-08-03 15:57:59 · 5463 阅读 · 0 评论 -
多线程:一些好的编程建议
给线程起个有意义的名字,这样可以方便找 Bug。 缩小同步范围,从而减少锁争用。例如对于 synchronized,应该尽量使用同步块而不是同步方法。 多用同步工具少用 wait() 和 notify()。首先,CountDownLatch, CyclicBarrier, Semaphore 和 Exchanger 这些同步类简化了编码操作,而用 wait() 和 noti...原创 2019-01-14 08:49:46 · 187 阅读 · 0 评论 -
多线程:线程安全?如何实现?
多个线程不管以何种方式访问某个类,并且在主调代码中不需要进行同步,都能表现正确的行为。线程安全有以下几种实现方式:1)不可变为什么是不可变?不可变(Immutable)的对象一定是线程安全的,不需要再采取任何的线程安全保障措施。只要一个不可变的对象被正确地构建出来,永远也不会看到它在多个线程之中处于不一致的状态。多线程环境下,应当尽量使对象成为不可变,来满足线程安全。有哪些不可...原创 2019-01-14 08:49:55 · 265 阅读 · 0 评论 -
多线程:了解一下ForkJoin、FutureTask、BlockingQueue
先了解一下这三种类FutureTask在介绍 Callable 时我们知道它可以有返回值,返回值通过 Future 进行封装。FutureTask 实现了 RunnableFuture 接口,该接口继承自 Runnable 和 Future 接口,这使得 FutureTask 既可以当做一个任务执行,也可以有返回值。public class FutureTask<V> i...原创 2019-01-13 22:18:41 · 322 阅读 · 0 评论 -
线程同步:Condition
使用Synchronized关键字(synchronized方法或者synchronized代码块)来保证线程间同步,则系统中存在同步监视器(显式或者隐式),可以使用wait()、notify()、notifyAll()来协调线程通信。但是当我们直接使用Lock对象来保证同步的话,则系统中就不存在同步监视器一说。也就不能使用上述的几个方法。那怎么办呢?当使用Lock对象保证同步的话,J...原创 2019-01-04 23:46:41 · 210 阅读 · 0 评论 -
并发编程:原子性问题,可见性问题,有序性问题。
以下是本文的目录大纲:一.内存模型的相关概念二.并发编程中的三个概念三.Java内存模型一.内存模型的相关概念大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速...原创 2019-01-10 16:03:32 · 299 阅读 · 0 评论 -
多线程:volatile
volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在了解volatile关键字时,可以先看一下上一篇博客了解一下与内存模型相关的概念和知识,然后此片文章才分析volatile关键字的实现原理,在给出了几个使用volatile关键字的场景。深入剖析volatile关键字volatile 修饰的成员变...原创 2019-01-10 20:04:12 · 375 阅读 · 0 评论 -
多线程:synchronized
https://blog.csdn.net/javazejian/article/details/72828483#中断与synchronized原创 2019-01-10 22:17:22 · 91 阅读 · 0 评论 -
多线程:synchronize、volatile、Lock 的区别与用法
Java多线程之内存可见性和原子性:Synchronized和Volatile的比较在说明Java多线程内存可见性之前,先来简单了解一下Java内存模型。(1)Java所有变量都存储在主内存中(2)每个线程都有自己独立的工作内存,里面保存该线程的使用到的变量副本(该副本就是主内存中该变量的一份拷贝)(1)线程对共享变量的所有操作都必须在自己的...原创 2019-01-11 09:28:31 · 2144 阅读 · 0 评论 -
多线程:CAS
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。 加锁后,获得CPU资源。那么会进入内核态进行线程切换,而用户态到内核态的切换会耗费资源,延迟。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程...原创 2019-01-11 09:40:44 · 139 阅读 · 0 评论 -
多线程:无锁、偏向锁、轻量锁、重量级锁
一:java多线程互斥,和java多线程引入偏向锁和轻量级锁的原因?--->synchronized的重量级别的锁,就是在线程运行到该代码块的时候,让程序的运行级别从用户态切换到内核态,把所有的线程挂起,让cpu通过操作系统指令,去调度多线程之间,谁执行代码块,谁进入阻塞状态。这样会频繁出现程序运行状态的切换,线程的挂起和唤醒,这样就会大量消耗资源,程序运行的效率低下。为了提高效率,jv...原创 2019-01-11 11:03:51 · 849 阅读 · 0 评论 -
多线程:线程池
深入浅出线程池jdk1.5引入Executor线程池框架,通过它把任务的提交和执行进行解耦,只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行、被哪个线程执行,以及什么时候执行。初始化线程池(4种)简介:Java线程池的工厂类:Executors类,初始化4种类型的线程池:newFixedThreadPool()说明:初始化一个指定线程数的线程池,其中corePoo...原创 2019-01-11 22:55:39 · 158 阅读 · 0 评论 -
多线程:线程同步的几种方式
1.synchronized同步方法 (静态方法锁住类对象,其它方法锁住实例对象) 即有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。 2.synchronized同步代码块 (锁住标记的对象) 即有synchr...原创 2019-01-13 19:44:05 · 1392 阅读 · 0 评论 -
多线程:线程池里的队列BlockingQueue
runnableTaskQueue(任务队列):用于保存等待执行的任务的阻塞队列。 可以选择以下几个阻塞队列:BlockingQueue的几个注意点【1】BlockingQueue 可以是限定容量的。它在任意给定时间都可以有一个remainingCapacity,超出此容量,便无法无阻塞地put 附加元素。没有任何内部容量约束的BlockingQueue 总是报告Integer.MAX_V...原创 2019-01-13 19:46:24 · 1165 阅读 · 0 评论 -
多线程:什么是ThreadLocal?应用场景?
ThreadLocal(避免线程不安全问题)什么是ThreadLocal? 线程本地变量,也有些地方叫做线程本地存储,他代表一个线程局部变量。为什么要ThreadLocal? 如果一段代码中所需要的数据必须与其他代码共享,那就看看这些共享数据的代码能否保证在同一个线程中执行?如果能够保证,我们就可以把共享数据的可见范围限定在同一个线程之内,这样无需同步,也能够保证线...原创 2019-01-13 20:08:42 · 624 阅读 · 0 评论 -
多线程:Executor、Sleep、Deamon、Yeild
Executor Executor是接口,Executors是工厂类!Executor 管理多个异步任务的执行,而无需程序员显式地管理线程的生命周期。这里的异步是指多个任务的执行互不干扰,不需要进行同步操作。主要有三种 Executor:CachedThreadPool:一个任务创建一个线程; FixedThreadPool:所有任务只能使用固定大小的线程; Singl...原创 2019-01-13 20:31:34 · 477 阅读 · 0 评论 -
多线程:中断(interrupt、interrupted、executor)
一个线程执行完毕之后会自动结束,如果在运行过程中发生异常也会提前结束。InterruptedException通过调用一个线程的 interrupt() 来中断该线程,如果该线程处于阻塞、限期等待或者无限期等待状态,那么就会抛出 InterruptedException,从而提前结束该线程。但是不能中断 I/O 阻塞和 synchronized 锁阻塞。对于以下代码,在 main() ...原创 2019-01-13 21:30:17 · 680 阅读 · 0 评论 -
多线程:线程之间的协作(join、wait、notify、notifyAll、await、signal、signalAll)
当多个线程可以一起工作去解决某个问题时,如果某些部分必须在其它部分之前完成,那么就需要对线程进行协调。join()在线程中调用另一个线程的 join() 方法,会将当前线程挂起,而不是忙等待,直到目标线程结束。对于以下代码,虽然 b 线程先启动,但是因为在 b 线程中调用了 a 线程的 join() 方法,b 线程会等待 a 线程结束才继续执行,因此最后能够保证 a 线程的输出先于 b...原创 2019-01-13 21:46:47 · 1018 阅读 · 2 评论 -
多线程:并发实现方法之J.U.C
java.util.concurrent(J.U.C)大大提高了并发性能。AQS 被认为是 J.U.C 的核心。什么是AQS? AQS是AbstractQueuedSynchronizer的简称。AQS提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架。CountdownLatch什么是CountdownLatch用来控制一个线程等待多个线程。维护了一个计数...原创 2019-01-13 21:59:15 · 404 阅读 · 0 评论 -
线程安全的强弱级别
线程安全:多个线程同时访问一个对象,不考虑在运行时环境下这些线程的调度和交替执行,无需进行额外的同步操作,或者在调用端也无需进行任何其它的协调操作,对于这个对象的调用行为都能够返回正确的结果,那么这个对象就是线程安全的。为什么会有线程安全的问题:根源在于多个线程之间存在共享数据访问的前提。线程安全等级:①不可变只要一个对象被正确的构建出来,它的状态就不能够发生改变的。若果共...原创 2019-08-04 10:42:41 · 451 阅读 · 0 评论