![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
zl1zl2zl3
这个作者很懒,什么都没留下…
展开
-
谈谈 ForkJoin 框架的设计与实现
在了解Fork-Join之前,我们得先了解什么是并行计算。并行计算相对于串行计算,并行计算可以划分成时间并行和空间并行。时间并行即指令流水化,也就是流水线技术。比如说生产一辆小汽车,有特定的轮子车间/发动机车间,同时进行各自的生产。空间并行是指使用多个处理器执行并发计算。以程序和算法设计人员的角度看,并行计算又可分为数据并行和任务并行。数据并行把大的任务化解成若干个相同的子任务,任务并行是指每一个线程执行一个分配到的任务,而这些线程则被分配(通常是操作系统内核)到该并行计算体系的各个计算节点.转载 2020-07-11 17:07:21 · 210 阅读 · 0 评论 -
Java多线程:线程属性
# 线程属性 id: 线程唯一标识。自动生成。不允许修改。 name: 线程的名字,可以自定义成有具体含义的名字,便于识别不同作用的线程。(可同名) isDaemon: 是否是守护线程。 true=守护线程,false=用户线程。 当JVM中所有的线程都是守护线程,JVM将退出。 具有代表性的线程: main线程:用户线程,gc线程:守护线程。 子线程会默认继承父线程的这个属性转载 2020-06-27 22:14:59 · 627 阅读 · 0 评论 -
Java多线程:捕获线程异常
你处理过多线程中的异常吗?如何捕获多线程中发生的异常?捕获子线程的异常与捕获当前线程的异常一样简单吗?除了try catch。Java中还可以通过异常处理器UncaughtExceptionHandler来处理那些未捕获的异常。# 在当前线程捕获当前线程发生的异常:/***@authorfutao*@date2020/6/17*/@Slf4jpublicclassExceptionInCurThread{publicstaticvoidma...转载 2020-06-27 22:12:45 · 1236 阅读 · 0 评论 -
为什么 wait 方法要在 synchronized 中调用?
作者:Yujiaao来源:https://segmentfault.com/a/1190000019962661一个有难度的 Java 问题,wait 和 notify。它们是在有synchronized标记的方法或synchronized块中调用的,因为 wait 和 nodify 需要监视对其调用的 Object。大多数Java开发人员都知道对象类的 wait(),notify() 和 notifyAll() 方法必须在 Java 中的synchronized方法或sy...转载 2020-06-18 16:40:56 · 1363 阅读 · 0 评论 -
我画了35张图,就是为了让你深入理解 AQS
前言谈到并发,我们不得不说AQS(AbstractQueuedSynchronizer),所谓的AQS即是抽象的队列式的同步器,内部定义了很多锁相关的方法,我们熟知的ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore等都是基于AQS来实现的。我们先看下AQS相关的UML图:1AQS实现原理AQS中 维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程...转载 2020-05-17 11:16:53 · 568 阅读 · 0 评论 -
图解 | 线程的麻烦事儿,Actor能解决吗?
冯诺伊曼体系中, CPU和内存居于核心的地位。内存就像一个个的小格子,其中保存着程序要读写的值。当只有一个线程来访问内存的时候,事情非常简单:但是,当出现多线程的时候,就可能会出现互相覆盖的危险:在多线程并发执行的情况下,为了得到正确的结果,必须要加锁。看起来加锁是一件轻松的事情, 但实际上并非如此, 让我们看一个转账的例子:有两个账户,账户A和账户B, 现在有...转载 2020-04-29 10:31:02 · 311 阅读 · 0 评论 -
300 行代码带你搞懂 Java 多线程!
线程线程的概念,百度是这样解释的:线程(英语:Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(Lightweight Processes),但轻量进程更多指内核线程(Kernel T...转载 2020-04-21 16:42:21 · 208 阅读 · 0 评论 -
腾讯面试官:如何停止一个正在运行的线程?我一脸蒙蔽。。。
停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作。停止一个线程可以用Thread.stop()方法,但最好不要用它。虽然它确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且是已被废弃的方法。在java中有以下3种方法可以终止正在运行的线程: 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。 使用stop方法强行终止,但是不推荐这...转载 2020-04-05 14:40:33 · 267 阅读 · 0 评论 -
一个Java多线程的问题,颠覆了我多年的认知!
作者 | ithuangqing来源 | 编码之外(ID:ithuangqing)碰见个奇怪的多线程问题小白们也不用怕,今天的文章你们都能看得懂????,最近的学习中,碰到这样的一个问题:Java创建多线程的方式有哪几种啊?你可能会说啦,这还不简单,不就是: 继承Thread类 实现Runnable接口 好像也是,如果你让我回答这个问题,我似乎也会这样回答...转载 2020-04-03 17:51:45 · 298 阅读 · 0 评论 -
面试官:线程顺序执行,这么多答案你都答不上来?
前言:最近在面试过程中,发现一些面高程的朋友连怎么实现线程顺序执行都答不上来,特分享相关文章,以作科普,有收获帮忙点个在看,感谢,助中秋快乐!一、实现本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止为了知道如何让线程按顺序运行,更是让读者对多线程的使用有更深刻的了解。使用的方法如下:[1] 使用线程的join方法[2] 使用主线程的jo...转载 2020-02-19 10:44:14 · 215 阅读 · 0 评论 -
从ReentrantLock的实现看AQS的原理及应用
AQS作为JUC中构建锁或者其他同步组件的基础框架,应用范围十分广泛,这篇文章会带着大家从可重入锁一点点揭开AQS的神秘面纱。前言Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从...转载 2019-12-06 10:38:21 · 354 阅读 · 0 评论 -
Java线程详解(18)-障碍器
Java5中,添加了障碍器类,为了适应一种新的设计需求,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择障碍器了。 障碍器是多线程并发控制的一种手段,用法很简单。下面给个例子:import java.util.concurrent.BrokenBarrierException; import java....转载 2018-10-30 08:12:55 · 188 阅读 · 0 评论 -
Java线程详解(17)-原子量
所谓的原子量即操作变量的操作是“原子的”,该操作不可再分,因此是线程安全的。 为何要使用原子变量呢,原因是多个线程对单个变量操作也会引起一些问题。在Java5之前,可以通过volatile、synchronized关键字来解决并发访问的安全问题,但这样太麻烦。 Java5之后,专门提供了用来进行单变量多线程并发安全访问的工具包java.util.concurre...翻译 2018-10-30 08:12:40 · 196 阅读 · 0 评论 -
实现java多线程的3种方式,99%人没用过第3种
实现多线程的3种方式1、继承Thread类看jdk源码可以发现,Thread类其实是实现了Runnable接口的一个实例,继承Thread类后需要重写run方法并通过start方法启动线程。继承Thread类耦合性太强了,因为java只能单继承,所以不利于扩展。 2、实现Runnable接口通过实现Runnable接口并重写run方法,并把Runnable实例传给Thr...转载 2018-11-05 09:46:08 · 209 阅读 · 0 评论 -
Java线程详解(16)-条件变量
条件变量是Java5线程中很重要的一个概念,顾名思义,条件变量就是表示条件的一种变量。但是必须说明,这里的条件是没有实际含义的,仅仅是个标记而已,并且条件的含义往往通过代码来赋予其含义。 这里的条件和普通意义上的条件表达式有着天壤之别。 条件变量都实现了java.util.concurrent.locks.Condition接口,条件变量的实例化...转载 2018-10-29 00:10:23 · 285 阅读 · 0 评论 -
Java线程详解(15)-阻塞队列和阻塞栈
Java线程:新特征-阻塞队列 阻塞队列是Java5线程新特征中的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue,阻塞队列的概念是,一个指定长度的队列,如果队列满了,添加新元素的操作会被阻塞等待,直到有空位为止。同样,当队列为空时候,请求队列元素的操作同样会阻塞等待,直到有可用元素为止。 有了这样的功能,...转载 2018-10-29 00:10:13 · 407 阅读 · 0 评论 -
阿里面试题,为什么wait()方法要放在同步块中?
某天我在***的时候,突然有个小伙伴微信上说:“哥,阿里面试又又挂了,被问到为什么wait()方法要放在同步块中,没答出来!”我顿时觉得**一紧,仔细回顾一下,如果wait()方法不在同步块中,代码的确会抛出异常:public class WaitInSyncBlockTest { @Test public void test() { try {...转载 2019-04-12 14:28:14 · 4948 阅读 · 8 评论 -
Java线程详解(14)-信号量
Java的信号量实际上是一个功能完毕的计数器,对控制一定资源的消费与回收有着很重要的意义,信号量常常用于多线程的代码中,并能监控有多少数目的线程等待获取资源,并且通过信号量可以得知可用资源的数目等等,这里总是在强调“数目”二字,但不能指出来有哪些在等待,哪些资源可用。 因此,本人认为,这个信号量类如果能返回数目,还能知道哪些对象在等待,哪些资源可使用,就非常完美了,仅仅拿到这些...转载 2018-10-29 00:10:04 · 207 阅读 · 0 评论 -
volatile关键字解析~高级java必问
volatile基本介绍volatile可以看成是synchronized的一种轻量级的实现,但volatile并不能完全代替synchronized,volatile有synchronized可见性的特性,但没有synchronized原子性的特性。可见性即用volatile关键字修饰的成员变量表明该变量不存在工作线程的副本,线程每次直接都从主内存中读取,每次读取的都是最新的值,这...转载 2018-11-05 09:47:34 · 203 阅读 · 0 评论 -
出场率比较高的一道多线程安全面试题
下面这个问题是 Java 程序员面试经常会遇到的吧。工作一两年的应该都知道 ArrayList 是线程不安全的,要使用线程安全的就使用 Vector,这也是各种 Java 面试宝典里面所提及的,可能很多工作好几年的程序员都停留在这个知识面上。先说说为什么 ArrayList 是线程不安全的吧,来看以下的代码。public class TestArrayList { pri...转载 2018-11-05 09:39:15 · 218 阅读 · 0 评论 -
史上最全 Java 多线程面试题及答案
这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题。这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不吝指教。 1、多线程有什么用?一个可能在很多人...转载 2018-11-05 10:33:10 · 390 阅读 · 0 评论 -
你应该知道的 volatile 关键字
前言不管是在面试还是实际开发中 volatile 都是一个应该掌握的技能。首先来看看为什么会出现这个关键字。 内存可见性由于 Java 内存模型( JMM)规定,所有的变量都存放在主内存中,而每个线程都有着自己的工作内存(高速缓存)。线程在工作时,需要将主内存中的数据拷贝到工作内存中。这样对数据的任何操作都是基于工作内存(效率提高),并且不能直接操作主内存以及其他线程工作内...转载 2018-11-14 08:43:58 · 197 阅读 · 0 评论 -
深入理解线程通信
前言开发中不免会遇到需要所有子线程执行完毕通知主线程处理某些逻辑的场景。或者是线程 A 在执行到某个条件通知线程 B 执行某个操作。可以通过以下几种方式实现: 等待通知机制等待通知模式是 Java 中比较经典的线程通信方式。两个线程通过对同一对象调用等待 wait() 和通知 notify() 方法来进行通讯。如两个线程交替打印奇偶数:public cla...转载 2018-11-14 08:45:24 · 238 阅读 · 0 评论 -
Java 中的多线程你只要看这一篇就够了
作者丨纳达丶无忌https://www.jianshu.com/p/40d4c7aebd66引如果对什么是线程、什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内。用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景...转载 2018-12-21 14:13:33 · 346 阅读 · 0 评论 -
死磕Synchronized底层实现--偏向锁
注:本篇很长,请找个舒适的姿势阅读。 本文为synchronized系列第二篇。主要内容为分析偏向锁的实现。偏向锁的诞生背景和基本原理在上文中已经讲过了,强烈建议在有看过上篇文章的基础下阅读本文。更多文章见个人博客:https://github.com/farmerjohngit/myblog本系列文章将对HotSpot的synchronized锁实现进行全面分析,内容包括...转载 2018-12-21 14:45:26 · 1320 阅读 · 0 评论 -
天天用Synchronized,底层原理是个啥?
作者:liuxiaopenghttps://www.cnblogs.com/paddix/p/5367116.htmlSynchronized 的基本使用Synchronized 的作用主要有三个: 确保线程互斥的访问同步代码 保证共享变量的修改能够及时可见 有效解决重排序问题 从语法上讲,Synchronized 总共有三种用法: 修饰普通...转载 2019-07-03 10:14:19 · 206 阅读 · 0 评论 -
synchronized 关键字原理
众所周知 synchronized 关键字是解决并发问题常用解决方案,有以下三种使用方式:同步普通方法,锁的是当前对象。 同步静态方法,锁的是当前 Class 对象。 同步块,锁的是 () 中的对象。实现原理: JVM 是通过进入、退出对象监视器( Monitor )来实现对方法、同步块的同步的。具体实现是在编译之后在同步方法调用前加入一个 monitor.enter 指令,在退出方...转载 2018-08-29 11:35:24 · 252 阅读 · 0 评论 -
Java线程详解(13)-锁
Java线程:新特征-锁(上) 在Java5中,专门提供了锁对象,利用锁可以方便的实现资源的封锁,用来控制对竞争资源并发访问的控制,这些内容主要集中在java.util.concurrent.locks包下面,里面有三个重要的接口Condition、Lock、ReadWriteLock。Condition将Object监视器方法(wait、notify和 notifyAll)...转载 2018-10-29 00:09:52 · 161 阅读 · 0 评论 -
Java线程详解(12)-有返回值的线程
在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写。或者干脆绕过这道坎,走别的路了。现在Java终于有可返回值的任务(也可以叫做线程)了。 可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。 执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到C...转载 2018-10-29 00:09:43 · 1137 阅读 · 0 评论 -
Thread类源码剖析
目录1.引子2.JVM线程状态3.Thread常用方法4.拓展点 一、引子说来也有些汗颜,搞了几年java,忽然发现竟然没拜读过java.lang.Thread类源码,这次特地拿出来晒一晒。本文将剖析Thread类源码(本文后面源码全部默认JDK8),并讲解一些重要的拓展点。希望对大家能有一些帮助。本文讲解主干全部出自源码和注释,保证了权威性。(注意:网上,某...转载 2018-02-02 15:33:24 · 992 阅读 · 0 评论 -
从Thread.start()方法看Thread源码,多次start一个线程会怎么样
这篇文章作为Thread类源码剖析的补充,从一个侧面来看Thread源码。也解答了面试高频问题:“多次start一个线程会怎么样?”答案是:java.lang.IllegalThreadStateException 线程状态非法异常 继承关系是:--->extends IllegalArgumentException--->extends RuntimeException一...转载 2018-02-06 09:48:20 · 3520 阅读 · 0 评论 -
Java 多线程:InheritableThreadLocal 实现原理
前言 介绍 InheritableThreadLocal 之前,假设对 ThreadLocal 已经有了一定的理解,比如基本概念,原理,如果没有,可以参考:Java 多线程:threadlocal关键字。这里再复习下 ThreadLocal 的原理,因为会对 InheritableThreadLocal 的理解 有重大的帮助:每个线程都有一个 ThreadLocalMap 类型的 ...转载 2018-02-06 16:16:50 · 243 阅读 · 0 评论 -
如何优雅的使用和理解线程池
前言平时接触过多线程开发的童鞋应该都或多或少了解过线程池,之前发布的《阿里巴巴 Java 手册》里也有一条:可见线程池的重要性。简单来说使用线程池有以下几个目的:线程是稀缺资源,不能频繁的创建。 解耦作用;线程的创建于执行完全分开,方便维护。 应当将其放入一个池子中,可以给其他任务进行复用。线程池原理谈到线程池就会想到池化技术,其中最核心的思想就是把宝贵的资源放到一个...转载 2018-08-30 08:55:39 · 196 阅读 · 0 评论 -
java ReentrantLock 实现原理
使用 synchronized 来做同步处理时,锁的获取和释放都是隐式的,实现的原理是通过编译后加上不同的机器指令来实现。而 ReentrantLock 就是一个普通的类,它是基于 AQS(AbstractQueuedSynchronizer)来实现的。是一个重入锁:一个线程获得了锁之后仍然可以反复的加锁,不会出现自己阻塞自己的情况。AQS 是 Java 并发包里实现锁、同步的一个重...转载 2018-08-30 08:50:56 · 2192 阅读 · 0 评论 -
Java 多线程三大核心
原子性Java 的原子性就和数据库事务的原子性差不多,一个操作中要么全部执行成功或者失败。JMM 只是保证了基本的原子性,但类似于 i++ 之类的操作,看似是原子操作,其实里面涉及到:获取 i 的值。 自增。 再赋值给 i。这三步操作,所以想要实现 i++ 这样的原子操作就需要用到 synchronized 或者是 lock 进行加锁处理。如果是基础类的自增操作可以使用 At...转载 2018-08-30 08:49:07 · 180 阅读 · 0 评论 -
Java 多线程常见问题
上下文切换多线程并不一定是要在多核处理器才支持的,就算是单核也是可以支持多线程的。 CPU 通过给每个线程分配一定的时间片,由于时间非常短通常是几十毫秒,所以 CPU 可以不停的切换线程执行任务从而达到了多线程的效果。但是由于在线程切换的时候需要保存本次执行的信息(详见),在该线程被 CPU 剥夺时间片后又再次运行恢复上次所保存的信息的过程就成为上下文切换。上下文切换是非常耗效率的。...转载 2018-08-29 11:34:14 · 213 阅读 · 0 评论 -
一个多线程死锁案例,如何避免及解决死锁问题?
多线程死锁在java程序员笔试的时候时有遇见,死锁概念在之前的文章有介绍,大家应该也都明白它的概念,不清楚的去翻看历史文章吧。 下面是一个多线程死锁的例子public class lock{ private static Object lock1 = new Object(); private static Object lock2 = new Obj...转载 2018-08-20 14:42:50 · 929 阅读 · 0 评论 -
多线程访问共享对象和数据的方式
在多线程访问共享对象和数据时候大致可以分为两大类。1:如果每个线程执行的代码相同,可以使用同一个runnable对象,这个runnable对象中有那个共享对象。如:买票系统。public class MulteThreadlShareData { public static void main(String[] args) { ShareData shareDat...转载 2018-08-20 14:18:48 · 282 阅读 · 0 评论 -
史上最全Java多线程面试题及答案
这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题。这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不吝指教。 1、多线程有什么用?一个可能在很多人看来...转载 2018-08-20 11:17:08 · 64843 阅读 · 12 评论 -
从Java视角理解CPU上下文切换(Context Switch)
在高性能编程时,经常接触到多线程. 起初我们的理解是, 多个线程并行地执行总比单个线程要快, 就像多个人一起干活总比一个人干要快. 然而实际情况是, 多线程之间需要竞争IO设备, 或者竞争锁资源,导致往往执行速度还不如单个线程. 在这里有一个经常提及的概念就是: 上下文切换(Context Switch). 上下文切换的精确定义可以参考: http://www.linfo.org/context...转载 2017-01-23 09:12:12 · 425 阅读 · 0 评论