多线程
文章平均质量分 83
分享并发编程技术
Java杨永杰
Java架构师,想要学习的技术点可以在评论区哦,会更新文章的~
展开
-
java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁
synchronized的执行过程:检测Mark Word里面是不是当前线程的ID,如果是,表示当前线程处于偏向锁如果不是,则使用CAS将当前线程的ID替换Mard Word,如果成功则表示当前线程获得偏向锁,置偏向标志位1如果失败,则说明发生竞争,撤销偏向锁,进而升级为轻量级锁。当前线程使用CAS将对象头的Mark Word替换为锁记录指针,如果成功,当前线程获得锁如果失败,表示其他线程竞争锁,当前线程便尝试使用自旋来获取锁。如果自旋成功则依然处于轻量级状态。如果自旋失败,则升级为重量级锁。原创 2024-01-27 18:49:30 · 685 阅读 · 0 评论 -
Java-守护线程
Java中的守护线程(Daemon Thread)是一种特殊类型的线程,它会在程序中的其他非守护线程全部结束时自动结束。原创 2024-01-27 12:50:10 · 943 阅读 · 0 评论 -
Java-ForkJoinPool介绍
🌺个人主页:杨永杰825_Spring,Mysql,多线程-CSDN博客⭐每日一句:成为架构师路途遥远📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️目录前言方法使用场景案例前言Java中的ForkJoinPool是一种用于并行计算的框架。它使用一种分而治之的方法来处理任务,将大任务分割成小任务,并在多个线程上并行执行。 ForkJoinPool使用工作窃取算法来提高并行计算的效率。具体来说,每个线程都维护一个工作队列,当线程完成自己的任务时,原创 2024-01-07 08:54:02 · 918 阅读 · 0 评论 -
Java-Thread类介绍
Thread类是Java中用于创建和操作线程的类,它是Java多线程编程的核心类之一。Thread类提供了线程的创建、启动、睡眠、等待、中断等操作方法,以及线程状态的获取和管理的方法。原创 2023-12-23 08:36:26 · 855 阅读 · 0 评论 -
Mesi缓存一致性协议
Mesi是一种缓存一致性协议,用于在多级缓存系统中保持缓存的一致性。它是根据缓存的状态来管理缓存的更新和访问,以确保数据的一致性。Mesi协议是由四个状态来定义缓存的状态,这些状态分别是:Modified(修改状态):当缓存中的数据被修改时,状态变为Modified。这意味着该数据已被缓存且与主内存中的数据不一致。Exclusive(独占状态):当缓存中的数据与主内存中的数据保持一致时,状态变为Exclusive。这表示该数据仅存在于当前缓存中。原创 2023-12-21 15:16:39 · 771 阅读 · 0 评论 -
java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁
synchronized的执行过程:检测Mark Word里面是不是当前线程的ID,如果是,表示当前线程处于偏向锁如果不是,则使用CAS将当前线程的ID替换Mard Word,如果成功则表示当前线程获得偏向锁,置偏向标志位1如果失败,则说明发生竞争,撤销偏向锁,进而升级为轻量级锁。当前线程使用CAS将对象头的Mark Word替换为锁记录指针,如果成功,当前线程获得锁如果失败,表示其他线程竞争锁,当前线程便尝试使用自旋来获取锁。如果自旋成功则依然处于轻量级状态。如果自旋失败,则升级为重量级锁。原创 2023-12-17 08:12:15 · 809 阅读 · 0 评论 -
Synchronized和Volatile区别
两者区别应该从Java Memory Model(Java内存模型),根据并发过程中如何处理、可见性、原子性和有序性这三个特性而建立的模型来说。可见性:JMM提供了volatile变量定义、final、synchronized块来保证可见性。原子性:个人理解是如果执行,就执行完,synchronized块来保证。有序性:觉得有序是相对性的,根据从哪个线程观察,volatile和synchronized保证线程之间操作的有序性。指令重排。原创 2023-12-10 16:07:55 · 832 阅读 · 0 评论 -
Synchronized 优化
Java synchronized 是一种机制,可以保证多个线程在访问共享资源时的同步性。synchronized 关键字可以用于方法或代码块上,当一个线程获取了这个对象的锁后,其他线程如果也要获取这个锁的话就必须等待该线程释放锁。这样可以保证共享资源的访问顺序和正确性,避免数据竞争和死锁等问题。原创 2023-12-10 11:02:10 · 1010 阅读 · 0 评论 -
并发编程-ReentrantLock 原理-非公平锁流程
先从构造器开始看,默认为非公平锁实现继承自AQS1.没有竞争时2.第一个竞争出现时CAS尝试将state由0改为1,结果失败进入tryAcquire逻辑,这时state已经是1,结果仍然失败接下来进入addWaiter逻辑,构造Node队列图中黄色三角表示该 Node的waitStatus状态,其中0为默认正常状态Node的创建是懒惰的其中第一个 Node称为Dummy(哑元)或哨兵,用来占位,并不关联线程3.当前线程进入。原创 2023-12-07 13:46:09 · 1222 阅读 · 0 评论 -
并发编程-CPU 缓存一致性
CPU 缓存一致性指的是多个 CPU 访问同一块内存区域时保持缓存中数据的一致性。由于多个 CPU 可以并行地访问内存,因此在数据被更新后可能会导致不同 CPU 中缓存的数据不一致,从而造成程序错误。原创 2023-12-06 13:23:06 · 381 阅读 · 0 评论 -
并发编程-线程等待唤醒机制
线程等待唤醒机制是指一种实现线程同步的机制,它可以使多个线程之间协调运行,避免了线程间的竞争和冲突。原创 2023-12-06 13:04:13 · 1035 阅读 · 0 评论 -
并发编程-如何使用中断标识停止线程
Java 中可以有三种方式中断线程。原创 2023-12-05 17:34:00 · 410 阅读 · 0 评论 -
synchronized的使用
synchronized 是Java语言中的关键字,它用于实现线程的同步,避免多个线程同时访问共享资源而产生的数据竞争问题。修饰实例方法,作用于当前实例,进入同步代码前需要先获取实例的锁修饰静态方法,作用于类的Class对象,进入修饰的静态方法前需要先获取类的Class对象的锁修饰代码块,需要指定加锁对象(记做lockobj),在进入同步代码块前需要先获取lockobj的锁。原创 2023-12-05 13:45:59 · 857 阅读 · 0 评论 -
并发编程-Atomic原子类
Java Atomic 原子类是Java中提供的一组线程安全的、基于硬件原子性实现的操作类,它们可以保证操作的原子性,避免了多线程并发时的数据竞争问题,提高了程序的性能和安全性。public final int get() //获取当前的值public final int getAndSet(int newValue)//获取当前的值,并设置新的值public final int getAndIncrement()//获取当前的值,并自增。原创 2023-12-04 20:52:30 · 887 阅读 · 1 评论 -
Java线程池拒绝策略
线程池中的任务队列已满时,新任务将被拒绝。这种情况下,线程池会采取一定的策略来拒绝新任务,这就是线程池的拒绝策略。原创 2023-12-04 19:43:21 · 334 阅读 · 0 评论 -
Java线程池原理解析
Java线程池是一种用于管理和重用线程的机制。它允许我们创建一个固定数量的线程,然后当需要执行任务时将任务提交给线程池。线程池会自动分配可用线程来执行任务,并在任务完成后将线程返回到线程池中以供重用。原创 2023-12-04 18:47:16 · 912 阅读 · 0 评论 -
并发工具类-CountDownLatch
Java CountDownLatch是一个同步辅助工具类,它允许一个或多个线程等待直到在其他线程中执行的一组操作完成。CountDownLatch内部维护了一个计数器,初始化时指定一个初始值。调用await()方法的线程将会阻塞,直至计数器减至0。每次调用countDown()方法,计数器的值都会减1。当计数器减至0时,所有等待线程将被唤醒。原创 2023-12-04 16:05:54 · 373 阅读 · 0 评论 -
CompletableFuture基本方法介绍
CompletableFuture是Java 8引入的异步编程的重要类之一。底层原理是使用了Future和Lambda表达式,通过链式调用的方式将多个异步任务组合成一个完整的异步任务,并且可以通过回调函数处理任务完成后的结果。CompletableFuture类中封装了一个待完成的任务,并提供了一系列的方法可以对任务进行操作,例如异步执行任务、阻塞等待任务结果、将任务结果传递给下一个任务等。当一个任务完成时,可以通过回调函数的方式处理结果,并将结果传递给下一个任务继续处理。原创 2023-12-04 15:57:42 · 1197 阅读 · 0 评论 -
ThreadLocal原理+底层说明
ThreadLocal类是一个线程局部变量,它提供了一种实现线程安全的方式,使得每个线程都可以保持一个独立的变量副本。其原理是通过ThreadLocal类的get()和set()方法,为每个线程创建一个独立的变量副本,保证了每个线程对变量的操作都是独立的,从而避免了线程安全问题。在上面谈到了对ThreadLocal的一些理解,那我们下面来看一下具体ThreadLocal是如何实现的。先了解一下ThreadLocal类提供的几个方法:Java代码。原创 2023-12-03 18:39:39 · 876 阅读 · 0 评论 -
Java线程池如何合理的设置大小
Java线程池是一种线程管理器,可以优化程序的性能和稳定性。它提供了线程复用机制,避免了线程创建和销毁的开销,同时根据任务的数量和进展情况来动态地调整线程的数目和优先级。Java线程池框架包括如下四个组件:任务队列:用于存放待执行任务的队列。线程池管理器:用于管理线程池的创建、销毁、可用线程数和任务队列的情况。工作线程:用于执行任务的线程。任务处理器:用于执行具体的任务。其中任务一般分为:CPU密集型、IO密集型、混合型,对于不同类型的任务需要分配不同大小的线程池。原创 2023-12-01 16:27:00 · 371 阅读 · 0 评论 -
多线程-Volatile关键字
Volatile是Java中的一个关键字,用于修饰变量。它的主要作用是保证变量的可见性和禁止指令重排序优化。原创 2023-11-29 13:23:17 · 846 阅读 · 0 评论 -
并发工具类同步屏障CyclicBarrier
CyclicBarrier是一种同步屏障,它可以使一组线程在达到某个屏障点(也称为“栅栏”)时暂停,直到所有线程都到达屏障点后,才能继续执行。在多线程编程中,CyclicBarrier可以用来同步线程的执行流程。CyclicBarrier的主要特点如下:可以设置参与线程的数量,当线程数量满足条件时,屏障会自动打开,使得所有线程可以继续执行。可以设置一个回调函数,当屏障打开后,会自动执行回调函数。可以重复使用,当所有线程都到达屏障点后,屏障会自动重置。原创 2023-11-29 13:09:27 · 365 阅读 · 0 评论 -
并发工具类-控制并发线程数的Semaphore
Semaphore是Java并发包中的一个类,用于控制对公共资源的访问。Semaphore维护了一组许可证,可以限制可访问公共资源的线程数量。Semaphore可以控制并发访问的线程数量,可以用来实现限流、资源池等场景。Semaphore还可以用于实现线程间的协作,例如等待一组任务完成后再继续执行。原创 2023-11-29 11:56:22 · 363 阅读 · 0 评论 -
线程优先级Priority?(全程无废话)
在操作系统中,线程可以划分优先级,优先级较高的线程得到cpu资源比较多,也就是cpu有限执行优先级较高的线程对象中的任务,但是不能保证一定优先级高,就先执行。Java的优先级分为1 ~ 10个等级,数字越人优先级越高,默认优先级大小为5。超出范围则抛出Java.lang.mlegalArgumentException底层源码:最小是1,最大是10。原创 2023-11-27 15:25:10 · 362 阅读 · 0 评论 -
多线程yield?(代码讲解)
放弃当前cpu资源,将它让给其他的任务占用cpu执行时问。但放弃的时问不确定,有可能刚刚放弃,马上又获得cpu时问片。加入yield,再来测试。(cpu让给其他资源导致速度变慢)测试代码:(cpu独占时间片)原创 2023-11-27 15:01:59 · 301 阅读 · 0 评论 -
线程开启?线程阻塞?线程死亡?(简洁版)
RUNNING 状态的线程执行 Thread.sleep(long ms) 或 Thread.join() 方法,或发出 /0 请求时,JVM 会将该线程置为阻塞状态。当 sleep() 状态超时, join() 等待线程终止或超时.或者 I/O 处理完毕时,线程重新转入可运行状态 ( RUNNABLE )run()方在调用 start() 方法后被执行,而且一旦线程启动后 start() 方法后就会立即返回,而不是等到 run() 方法执行完毕后再返回。对象,最后执行 start() 方法即可;原创 2023-11-26 12:41:32 · 353 阅读 · 0 评论 -
什么是线程死锁?如何避免死锁?如何检测死锁?
通过指定锁的获取顺序,比如规定,只有获得A锁的线程才有资格获取B锁,按顺序获取锁就可以避免死锁。指定获取锁的顺序,比如某个线程只有获得A锁和B锁,才能对某资源进行操作,在多线程条件下,如何避免死锁?不剥夺条件:线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。原创 2023-11-26 10:38:15 · 398 阅读 · 0 评论 -
多线程CAS
CAS: 全称 compare and swap ,即比较并交换,它是一条 CPU 同步原语。是一种硬件对并发的支持,针对多处理器操作而设计的一种特殊指令,用于管理对共享数据的并发访问。CAS 是一种无锁的非阻塞法的实现。原创 2023-11-25 20:45:19 · 345 阅读 · 0 评论 -
操作系统之进程调度算法
无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。原创 2023-11-22 14:15:57 · 893 阅读 · 0 评论 -
Java线程生命周期(状态)
当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。尤其是当线程启动以后,它不可能一直"霸占"着CPU独自运行,所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换。原创 2023-11-21 17:30:52 · 31 阅读 · 0 评论 -
线程同步的方式有哪些?
线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多,临界区对象就是其中一种。主要解决多个线程之间按照顺序访问同一个共享资源,避免因为并发冲突导致的问题。原创 2023-11-21 10:31:55 · 37 阅读 · 0 评论 -
Synchronized 相关面试题 (精简版)
可重入性是锁的一个基本要求,是为了解决自己锁死自己的情况比如下面的伪代码,一个类中的同步方法调用另一个同步方法,假如Synchronized 不支持重入,进入 method2 方法时当前线程获得锁method2 方法里面执行 method1 时当前线程又要去尝试获取锁,这时如果不支持重入,它就要等释放,把自己阻塞,导致自己锁死自己Synchronized 来说,可重入性是显而易见的,刚才提到,在执行对monitorenter 指令时,如果这个对象没有锁定,或者当前线程已经拥。原创 2023-11-20 10:48:40 · 153 阅读 · 0 评论 -
Synchronized 关键字的底层原理
synchronized 关键字底层原理属于JVM 层面 从上图可以看出来: 从上图可以看出来:原创 2023-11-19 09:13:14 · 93 阅读 · 0 评论 -
Java内存模型(JMM) ----多线程/并发编程
内存的读写速度成为了计算机运行的瓶颈。冯诺依曼,提出计算机由五大组成部分,输入设备,输出设备存储器,控制器,运算器。我们的程序都是在内存中运行的,内存会保存程序运行时的数据,供CPU处理。中央处理器,是计算机的控制和运算的核心,我们的程序最终都会变成指令让。,速度要慢一些,一般情况下每个核上都有一个独立的。的运算速度和内存的访问速度相差比较大。,速度也更快,同时也代表着容量越小。,同时也是缓存中最慢的一级,在同一个。,速度最快,每个核上都有一个。去执行,处理程序中的数据。的,它容量最小,例如。原创 2023-11-16 13:57:23 · 68 阅读 · 0 评论 -
并发编程(多线程)-可见性、有序性、原子性问题
案例演示:一个线程根据boolean类型的标记flag,while循环,另一个线程改变这个flag变量的值,另一个线程并不会停止循环。并发编程时,会出现可见性问题,当一个线程对共享变量进行了修改,另外的线程并没有立即看修改后的最新值。原创 2023-11-15 18:27:36 · 353 阅读 · 1 评论