并发 & 线程
文章平均质量分 56
多线程
陆氪和他的那些代码
学习可以偷懒,面试好好发挥就行
展开
-
Transaction - 记一次 Spring 事务联合 Redis 挂了引发的生产事故
Transaction - 记一次 Spring 事务联合 Redis 挂了引发的生产事故原创 2023-09-20 18:04:59 · 445 阅读 · 2 评论 -
多线程 - 一篇带你理解 InheritableThreadLocal 作用
代码/** * @author Lux Sun * @date 2021/12/30 */public class Cat { public Cat(String name) { this.name = name; } private String name; public String getName() { return name; } public void setName(String name)原创 2022-01-07 18:05:03 · 382 阅读 · 0 评论 -
多线程 - Java 多线程编程排查异常技巧
一句话在可疑觉得会异常的地方包个 try catch 即可~因为有时在多线程里,异常会被子线程隐藏住,所以用此技巧可以将异常显明出来!原创 2021-10-12 14:16:41 · 313 阅读 · 0 评论 -
ExecutorService - invokeAll 和 invokeAny 使用场景
ExecutorService - invokeAll 和 invokeAny 使用场景原创 2021-09-28 18:42:03 · 480 阅读 · 0 评论 -
多线程 - Callable、Future 和 FutureTask 简单应用
多线程 - Callable、Future 和 FutureTask 简单应用原创 2021-09-28 18:36:05 · 285 阅读 · 2 评论 -
多线程 - 多线程中使用静态方法存在线程安全的问题
类的成员分两类,静态成员(static member)和实例成员(instance menber),静态成员属于类,实例成员则属于对象,即类的实例。我们知道,静态字段和静态方法的调用都是通过类来调用的,静态方法不会对特定的实例操作,只能调用调用类中的其他属性和静态方法,不能调用类中的非静态属性和非静态方法。实例方法可以对特定的实例操作,既能访问静态属性和静态方法,也能访问实例属性和实例方法。在多线程中使用静态方法是否有安全问题?这样看在静态方法中时候使用了静态成员。在多线程中使用一个静态方法的时候,原创 2021-08-19 18:18:33 · 3574 阅读 · 4 评论 -
线程 - 线程优先级的高低和执行顺序的关系
线程的调度由操作系统负责,即使是编译器也没办法完全包办。也即是说,运行时轮到哪个线程运行,完全由操作系统决定,优先级高的,只是轮到机会高一些,并非完全独占CPU运行;优先级低的也并非要等高优先级的线程运行完才能轮到,相对来说,轮到的机率低一些。如果是VxWorks这样的实时系统,那么优先级高表示优先得到响应(这时候它不一定在执行,也可以在睡眠);Linux系统优先级高表示它越倾向于IO消耗型,那么它在中断到来时肯定要尽快投入运行,但是相对CPU消耗型来说,实际上它肯定是等待的时候更多,所以原创 2021-04-26 13:34:53 · 2124 阅读 · 0 评论 -
线程 - 一句话说明白 Java 线程池中 shutdown 和 shutdownNow 的区别
一般情况下,当我们频繁的使用线程的时候,为了节约资源快速响应需求,我们都会考虑使用线程池,线程池使用完毕都会想着关闭,关闭的时候一般情况下会用到shutdown和shutdownNow,这两个函数都能够用来关闭线程池,那么他们俩之间的区别是什么呢?下面我就用一句话来说明白shutdown和shutdownNow的区别。一、shutdown 和 shutdownNow 区别shutdown只是将线程池的状态设置为SHUTWDOWN状态,正在执行的任务会继续执行下去,没有被执行的则中断。而sh..转载 2021-04-05 17:13:05 · 387 阅读 · 0 评论 -
线程 - 父线程与子线程传值问题
一、ThreadLocal回顾ThreadLocal对象用于在同一个线程中传递数据,避免显式的在方法中传参。每个线程中保存了ThreadLocalMap对象,ThreadLocalMap对象的key就是ThreadLocal对象本身,value就是当前线程的值。看下ThreadLocal的get方法public T get() { //当前线程 Thread t = Thread.currentThread(); //获取当前线程的ThreadLocalMap对象转载 2020-12-14 17:44:15 · 1333 阅读 · 4 评论 -
线程 - 守护线程或用户线程(setDaemon)
class StopThread implements Runnable{ private boolean flag = true; public synchronized void run() { while(flag) { try { wait(); } catch(InterruptedException e)...转载 2020-10-30 18:06:43 · 381 阅读 · 0 评论 -
线程 - 并发与并行的区别是什么(生活版)?
你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。 你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。 你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。所以我认为它们最关键的点就是:是否是『同时』。...转载 2020-10-28 14:09:03 · 232 阅读 · 0 评论 -
Java并发编程 - 一段代码解释 ThreadLocal 特性
/** * @author Lux Sun * @date 2020/9/10 */public class demo implements Runnable { private static ThreadLocal<String> threadLocal = new ThreadLocal<>(); @Override public void run() { System.out.println(threadLocal.get(.原创 2020-09-10 13:29:06 · 250 阅读 · 0 评论 -
线程 - wait & sleep 区别
区别这两个方法来自不同的类分别是Thread和Object 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁) wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围) sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异...转载 2020-04-24 16:31:48 · 248 阅读 · 0 评论 -
Java并发编程 - 自旋锁 & 互斥锁的区别
自旋锁是一种互斥锁的实现方式而已,相比一般的互斥锁会在等待期间放弃CPU,自旋锁(spinlock)则是不断循环并测试锁的状态,这样就一直占着CPU。互斥锁:用于保护临界区,确保同一时间只有一个线程访问数据。对共享资源的访问,先对互斥量进行加锁,如果互斥量已经上锁,调用线程会阻塞,直到互斥量被解锁。在完成了对共享资源的访问后,要对互斥量进行解锁。临界区:每个进程中访问临界资源的那段程序称为...转载 2020-04-17 09:24:30 · 412 阅读 · 0 评论 -
Java并发编程 - 有状态 & 无状态的对象区别
一、基本概念1、有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。2、无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象.不能保存数据,是不变类,是线程安全的。二、看代码加深印象/** * 有状态bean,有state,...转载 2020-04-16 13:03:05 · 663 阅读 · 0 评论 -
Java并发编程 - HashMap 死循环
问题最近的几次面试中,我都问了是否了解HashMap在并发使用时可能发生死循环,导致cpu100%,结果让我很意外,都表示不知道有这样的问题,让我意外的是面试者的工作年限都不短。由于HashMap并非是线程安全的,所以在高并发的情况下必然会出现问题,这是一个普遍的问题,虽然网上分析的文章很多,还是觉得有必须写一篇文章,让关注我公众号的同学能够意识到这个问题,并了解这个死循环是如何产生的。...转载 2020-04-16 12:59:07 · 348 阅读 · 0 评论 -
Java并发编程 - HashMap & ConcurrentHashMap 解析
线程不安全的HashMap众所周知,HashMap是非线程安全的。而HashMap的线程不安全主要体现在resize时的死循环及使用迭代器时的fast-fail上。注:本章的代码均基于JDK 1.7.0_67HashMap工作原理HashMap数据结构常用的底层数据结构主要有数组和链表。数组存储区间连续,占用内存较多,寻址容易,插入和删除困难。链表存储区间离散,占用内存较...转载 2020-04-16 12:59:29 · 316 阅读 · 0 评论 -
Java并发编程 - 多线程并发最佳实践
使用本地变量尽量使用本地变量,而不是创建一个类或实例的变量。使用不可变类String、Integer等。不可变类可以降低代码中需要的同步数量。最小化锁的作用域范围:S=1/(1-a+a/n)a:并行计算部分所占比例n:并行处理结点个数S:加速比当1-a等于0时,没有串行只有并行,最大加速比 S=n当a=0时,只有串行没有并行,最小加速比 S = 1...转载 2020-04-16 12:03:29 · 310 阅读 · 0 评论 -
Java并发编程 - 死锁
死锁的必要条件1、互斥条件 在某一段时间,只能由一个线程占用,如果此时有其他的线程请求,那么请求者只能等待,直到资源释放。2、请求和保持条件 已经占有至少一个资源,有提出请求其他资源,该资源已经被其他线程占用,请求进程阻塞,但又对已获得的线程不放。3、不剥夺条件 已经占有的资源不会被剥夺,只能自己释放。4、环路等待条件 发生死锁的时候,一定存在一个进程,他是一个死锁的...原创 2020-04-16 12:01:39 · 330 阅读 · 0 评论 -
Java并发编程 - ThreadPoolExecutor 应用
newCachedThreadPool: 可缓存线程池,可灵活回收空闲线程newFixedThreadPool: 定长线程池,可控制线程的最大并发数,超出的线程会在队列中等待newScheduledThreadPool: 定时线程池,支持定时和周期性任务的执行newSingleThreadExecutor: 单线程化的线程池,保证所有任务按照指定顺序(先入...原创 2020-04-16 11:15:34 · 331 阅读 · 0 评论 -
Java并发编程 - ThreadPoolExecutor 简介
三个参数的关系(当前线程数 ctn)1. 当cnt<corePoolSize,直接创建新线程处理任务,即使线程池中其他线程空闲。2. 当corePoolSize<=ctn<maximumPoolSize,只有当workQueue满的时候才创建新的线程去处理任务。3. 当corePoolsize=maximumPoolsize时,创建的线程池大小是固定的,如...原创 2020-04-16 10:55:43 · 298 阅读 · 0 评论 -
Java并发编程 - 公平锁 & 非公平锁
公平锁是指多个线程按照申请锁的顺序来获取锁,类似排队打饭,先来后到。 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁在高并发的情况下,有可能会造成优先级反转或者饥饿现象 并发包中ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或非公平锁,默认是非公平锁。两者区别公平锁:Threa...转载 2020-04-15 23:18:55 · 361 阅读 · 0 评论 -
JUC - BlockingQueue
一. 前言在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。二. 认识BlockingQueue阻塞队列,顾名思义,首先它是一个队列,而一个队...转载 2020-04-15 23:11:00 · 268 阅读 · 0 评论 -
JUC - ForkJoin
Java 7开始引入了一种新的Fork/Join线程池,它可以执行一种特殊的任务:把一个大任务拆成多个小任务并行执行。我们举个例子:如果要计算一个超大数组的和,最简单的做法是用一个循环在一个线程内完成:┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴...转载 2020-04-15 21:37:18 · 293 阅读 · 0 评论 -
JUC - FutureTask(Runnable + Future)
package com.mmall.concurrency.example.aqs;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;@Slf4jpublic class FutureTaskExample { ...原创 2020-04-15 20:35:09 · 313 阅读 · 0 评论 -
JUC - Future
在执行多个任务的时候,使用Java标准库提供的线程池是非常方便的。我们提交的任务只需要实现Runnable接口,就可以让线程池去执行:class Task implements Runnable { public String result; public void run() { this.result = longTimeCalculation(); ...转载 2020-04-15 20:29:26 · 636 阅读 · 0 评论 -
线程 - 守护线程
Java程序入口就是由JVM启动main线程,main线程又可以启动其他线程。当所有线程都运行结束时,JVM退出,进程结束。如果有一个线程没有退出,JVM进程就不会退出。所以,必须保证所有线程都能及时结束。但是有一种线程的目的就是无限循环,例如,一个定时触发任务的线程:class TimerThread extends Thread { @Override publi...转载 2020-04-15 20:11:23 · 322 阅读 · 0 评论 -
Java并发编程 - 乐观锁 & 悲观锁
并发控制当程序中可能出现并发的情况时,我们就需要通过一定的手段来保证在并发情况下数据的准确性,通过这种手段保证了当前用户和其他用户一起操作时,所得到的结果和他单独操作时的结果是一样的。这种手段就叫做并发控制。并发控制的目的是保证一个用户的工作不会对另一个用户的工作产生不合理的影响。没有做好并发控制,就可能导致脏读、幻读和不可重复读等问题。我们常说的并发控制,一般都和数据库管理系统(...转载 2020-04-15 16:50:15 · 325 阅读 · 0 评论 -
线程 - wait、await 区别
wai()是Object类提供的,一般与synchronized联合使用。调用wait之后会释放锁,导致线程等待。唤醒进程使用notify()或者notifyAll()。await()Condition类是当中的,一般与Lock联合使用。举例synchronized(obj){ obj.wait();//消费方没东西了,等待}synchronize(obj){ ob...转载 2020-04-15 11:55:28 · 2422 阅读 · 0 评论 -
线程 - 你真的懂 wait、notify、notifyAll 吗?
生产者消费者模型是我们学习多线程知识的一个经典案例,一个典型的生产者消费者模型如下。public void produce() { synchronized (this) { while (mBuf.isFull()) { try { wait(); } catch (Interrup...转载 2020-04-15 11:52:22 · 309 阅读 · 0 评论 -
线程 - Java 多线程编程
Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。这里定义和线程相关的另一个术语 - 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束...转载 2019-09-02 12:22:02 · 227 阅读 · 0 评论 -
线程 - 带返回值的多线程
之前我们使用多线程要么是继承Thread类,要么是实现Runnable接口,然后重写一下run()方法即可。但是只有的话如果有死锁、对共享资源的访问和随时监控线程状态就不行了,于是在Java5之后就有了Callable接口。简单实现带返回值的线程代码如下:CallableFuture类package com.test.thread; import java.util...转载 2019-09-02 11:52:56 · 816 阅读 · 0 评论 -
线程 - 获取 Java 线程返回值的几种方式
在实际开发过程中,我们有时候会遇到主线程调用子线程,要等待子线程返回的结果来进行下一步动作的业务。那么怎么获取子线程返回的值呢,我这里总结了三种方式:主线程等待 Join方法等待 实现Callable接口Entity 类package com.basic.thread;/** * @author zhangxingrui * @create 2019-02-...转载 2019-09-01 22:23:55 · 964 阅读 · 0 评论 -
线程 - 这段危险代码90%的人都写过!
最近一个同学发来消息说,公司里有一段代码使用的线程经常会发生一些莫名其妙的问题。让我帮忙看看,我仔细看了很多遍线程的相关代码。最后注意到了 InterruptException 异常,把想法和 demo 代码给他说了后,问题果真被解决了。关于这个问题,我通过一段简化的代码来给大家演示一下。看到上面这段 demo 了吗?多简单,多熟悉啊。但是有一个问题,90% 的人可能都没有遇到,但...原创 2019-05-27 23:41:13 · 272 阅读 · 0 评论 -
多线程 - Synchronized 篇
一、Synchronized简介Ps1:join() 方法作用:等待线程执行完后才会执行下面的接下来的语句。Ps2:两个线程同时a++, 最后结果会比预计的少(读取a, a++, 将a写入内存),所以每一步执行完都有可能被打断,所以a值有可能没写进内存就执行另一个线程的a++操作了,so...二、Synchronized的两种用法(对象锁和类锁)1、对象锁...原创 2019-01-04 18:19:29 · 314 阅读 · 0 评论 -
Java - 多线程
什么是多线程a、进程的概念:进程是指可执行程序并存放在计算机存储器的一个指令序列,它是一个动态执行的过程。b、线程是比进程还要小的运行单位,一个进程包含多个线程。c、线程可以看做一个子程序。Ps:之所以看起来好像它们是同时运行是因为时间片单位很小的时候,当它们属于轮流运行时,看起来就像“同时运行”。线程的创建创建一个Thread类,或者一个Thread子...原创 2020-03-24 11:08:07 · 434 阅读 · 0 评论 -
Java并发编程 - 不可重入锁 & 可重入锁
最近正在阅读Java ReentrantLock源码,始终对可重入和不可重入概念理解不透彻,进行学习后记录在这里。基础知识Java多线程的wait()方法和notify()方法这两个方法是成对出现和使用的,要执行这两个方法,有一个前提就是,当前线程必须获其对象的monitor(俗称“锁”),否则会抛出IllegalMonitorStateException异常,所以这两个方法...转载 2020-04-15 11:42:03 · 348 阅读 · 0 评论 -
Java并发编程 - AQS 之 Condition
使用ReentrantLock比直接使用synchronized更安全,可以替代synchronized进行线程同步。但是,synchronized可以配合wait和notify实现线程在条件不满足时等待,条件满足时唤醒,用ReentrantLock我们怎么编写wait和notify的功能呢?答案是使用Condition对象来实现wait和notify的功能。我们仍然以TaskQueu...转载 2020-04-15 11:39:34 · 307 阅读 · 0 评论 -
Java并发编程 - AQS 之 StampedLock
前面介绍的ReadWriteLock可以解决多线程同时读,但只有一个线程能写的问题。如果我们深入分析ReadWriteLock,会发现它有个潜在的问题:如果有线程正在读,写线程需要等待读线程释放锁后才能获取写锁,即读的过程中不允许写,这是一种悲观的读锁。要进一步提升并发执行效率,Java 8引入了新的读写锁:StampedLock。StampedLock和ReadWriteLock相比...转载 2020-04-15 11:37:54 · 327 阅读 · 0 评论 -
Java并发编程 - AQS 之 ReentrantReadWriteLock
介绍ReentrantLock是互斥排他锁,同一时间只能有一个线程在执行任务,ReentrantLock支持锁的重入功能,虽然保证了线程的安全性,但是效率不高,实际上应该是写操作互斥,读操作共享。而jdk提供了读写锁ReentrantReadWriteLock。公共代码(下面四种情况代码根据时间等候判断区别)public class MyTask { private ...原创 2020-04-15 09:56:05 · 383 阅读 · 0 评论