高并发多线程
文章平均质量分 69
健康平安的活着
再给我一次重生的机会,我将加倍珍惜,将java事业进行到底。
展开
-
多线程JUC 第2季 BlockingQueue 阻塞队列
阻塞队列(BlockingQueue)是一个在队列基础上又支持了两个附加操作的队列:put方法:当队列装满时,添加的线程则被阻塞,直到队列不满,则可用。take方法:当队列为空时,消费的线程则被阻塞,直到队列不空时,则可用。原创 2024-05-27 20:37:47 · 242 阅读 · 0 评论 -
多线程JUC 第2季 JMM的内存结构和作用
jmm就是屏蔽各个操作系统以及硬件之间的访问差异。实现让java程序在各种平台下能达到一致的访问效果。围绕着多线程的原子性,可见性,和有序性展开的。正常情况cpu的的运行,需要从缓存中读取数据,缓存从内存加载数据。但是就存在一个问题,内存和缓存数据存在不一致的问题。解决的策略就是JMM,原创 2024-04-08 22:47:14 · 242 阅读 · 0 评论 -
多线程JUC 第2季 synchornized和Lock锁(重入,公平)
synchronized,和lock锁都是一种悲观锁。悲观锁适用于写多场景,乐观锁适用于读多场景,实现策略有:版本号和cas自旋算法。原创 2024-03-30 19:11:37 · 200 阅读 · 0 评论 -
java篇 让java对象具有链式调用
1.在类中引入注解@Accessors(chain = true),引入后,不要在使用自定义的getter,setter方法。原创 2024-03-23 10:54:24 · 453 阅读 · 0 评论 -
多线程JUC 第2季 重入锁中lock和trylock方法
lock方法是一种阻塞性的获取锁的方式,当调用一个对象的lock方法时,如果锁当前被其他线程持有,那么当前线程将会被挂起(即阻塞),直到锁被释放,这种机制确保了只有一个线程能够在同一时间访问被锁保护的代码块或资源,从而避免了并发问题,但是,它也可能导致线程长时间等待,特别是在高并发环境下,如果锁的持有者因为某些原因(如死锁)未能及时释放锁,那么其他线程可能会一直等待下去。tryLock方法则是一种非阻塞性的获取锁的方式,当调用一个对象的tryLock方法时,如果锁当前可用,那么将成功获得锁并继续执行;原创 2024-03-17 21:55:29 · 411 阅读 · 0 评论 -
多线程JUC 第2季 wait和notify唤醒机制
1) 使用wait()、notify()和notifyAII()时需要先对调用对象加锁。否则直接调用的话会抛出 IllegalMonitorStateExceptiona。2) 调用wait()方法后,线程状态。由RUNNING变为WAITING,并将当前线程放置到对象的等待队列。3) notify()或notifyAlI()方法调用后,等待线程依旧不会从wait()返回,需要调用notify()或notifAII()的线程释放锁之后,等待线程才有机会从wait()返回。原创 2024-03-17 21:02:21 · 851 阅读 · 0 评论 -
多线程JUC 第2季 Future接口与completablefuture接口异步
如果主线程需要执行一个耗时的计算任务,可以使用future把这个任务放到异步线程中执行。主线程继续处理其他任务或者先行结束,再通过future获取计算结果。future接口可以为主线程开一个分支任务,专门为主线程处理耗时和费力的复杂业务。特点:多线程,又返回值,异步任务。原创 2024-03-14 23:08:22 · 381 阅读 · 0 评论 -
多线程JUC 第2季 volatile变量的使用
当写一个volatile变量时,jmm会把该线程对应的本地内存中共享变量值立即刷回主内存中。当读一个volatile变量时,jmm会把该线程本地的内存值设置无效,重新回到主内存中读取最新的值。所以,原创 2024-03-09 09:14:17 · 418 阅读 · 0 评论 -
多线程JUC 第2季 LockSupport的等待唤醒机制
locksupport阻塞当前线程和唤醒指定阻塞的线程。原创 2024-03-03 10:38:01 · 380 阅读 · 0 评论 -
多线程JUC 第2季 中断线程(Interrupted,Interrput,IsInterput)
1.public void interrupt(): 实例方法,仅仅是设置线程中断状态为true,发起一个协商而不会立刻停止线程。静态方法,判断当前线程是否中断并清除当前线程的中断状态。做两件事:a)返回当前线程的中断状态,测试当前线程是否已经中断。b)将当前线程的中断状态清零并重新设置为true,清除线程的中断状态。3.public boolean isinterrupted():实例方法判断当前线程是不是中断,检测中断标志位。原创 2024-03-03 07:57:31 · 500 阅读 · 0 评论 -
java中Timer和Timertask的关系
1.Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个类;2.Timer和TimerTask成对出现,Timer是定时器,TimerTask是定时任务。换句话说,定时任务TimerTask是给定时器Timer执行的具体任务。TimerTask实现Runnable接口的run方法。3.每一个Timer仅对应唯一一个线程。Timer不保证任务执行的十分精确。Timer类的线程安全的。原创 2024-03-02 11:54:16 · 1958 阅读 · 1 评论 -
多线程JUC 第2季 CAS的作用介绍与自旋锁
CAS有3个操作数,位置内存值V,旧的预期值A,要修改的更新值B,如果内存值V和预期值相同则,内存值改为B,否则什么都不做。当它重来重试的这种行为称为-自旋。CAS是一条cpu的原子指令,不会造成所谓的数据不一致问题。CAS是靠硬件实现的从而在硬件层面提升效率,最底层还是交给硬件来保证原子性和可见性。2.案例代码。原创 2023-12-14 17:36:46 · 504 阅读 · 0 评论 -
多线程JUC 第2季 多线程的原子性
【代码】多线程JUC 第2季 多线程的原子性。原创 2023-11-06 22:41:57 · 182 阅读 · 0 评论 -
多线程JUC 第2季 多线程的内存模型
实例数据,对齐填充。原创 2023-11-05 12:46:44 · 197 阅读 · 0 评论 -
多线程JUC 第2季 ThreadLocal的详解
1.threadlock 是线程局部变量,每一个线程访问threadlock修饰的变量,都会自己复制一份变量副本,然后进行操作,线程之间的操作会不干扰。原创 2023-10-21 20:40:49 · 214 阅读 · 0 评论 -
多线程JUC 第2季 锁的消除与锁粗化(了解)
从JIT角度看,相当于无视它,synchronized(o)不存在,这个对象并没有被共用扩散到其它线程使用,极端的说就是根本没有加这个锁对象的定成机器码,消除了锁的使用。原创 2023-09-17 11:59:50 · 143 阅读 · 0 评论 -
多线程JUC 第2季 ReentranctLock实现加锁和解锁过程
1.ReentrantLock 意思为可重入锁,指的是一个线程能够对一个临界资源重复加锁。ReentrantLock内部实现依赖于AQS。原创 2023-09-17 05:49:35 · 198 阅读 · 0 评论 -
多线程JUC 第2季 synchronized锁升级过程
1.结构: 前两行为8字节;后一行为类型指针4字节。2.读取流程3.结论:无锁状态,一个对象被实例化后,如果还没有被任何线程竞争锁,那么它为无锁状态(001)三 偏向锁3.1。原创 2023-09-13 20:12:48 · 194 阅读 · 0 评论 -
使用信号量Semaphore 实现多线程访问
【代码】使用信号量Semaphore 实现多线程访问。原创 2023-07-08 19:20:11 · 334 阅读 · 1 评论 -
多线程JUC 第2季 读写锁ReentrantReadWriteLock&stamplock邮戳锁
reentranctReadWriteloc 解决是读读共享,读写互斥。在读多写少的场景下,读写锁具有较高的性能。原创 2023-05-21 10:39:40 · 494 阅读 · 0 评论 -
多线程JUC 第2季 AQS源码分析以及公平锁
AQS : 抽象队列同步器。原创 2023-05-07 21:56:57 · 109 阅读 · 0 评论 -
多线程JUC 第2季 deadlock的模拟
public class ObjectTools { public static Object folk=new Object(); public static Object chlk=new Object();}1.2 子线程线程2:1.3 调用类public class TestDl { public static void main(String[] args) { new Thread(new ThreadA()).star原创 2022-10-04 08:47:54 · 323 阅读 · 0 评论 -
多线程JUC 篇 1.1juc的基本知识
线程:它被包含在进程中,是进程中真正执行任务的最小单位,一个进程中可以有多个并发的线程,每天线程执行不同的任务。保证了同一时刻只有一个进程在管程内活动,即管程内定义的操作在同一时刻只被一个进程调用(由编译器实现)。wait会且必须当前线程占有锁(即wait需要写到sychronized修饰的代码中),会释放锁。用户线程:当任何一个用户线程未结束,Java虚拟机是不会结束的。守护线程:如果只剩守护线程未结束,Java虚拟机结束。并行:同一时间段内,多个线程在执行任务。从集合的角度来说,进程是线程的容器。原创 2022-08-22 12:15:23 · 412 阅读 · 0 评论 -
多线程JUC 篇 2.1 创建多线程的步骤(synchronized和lock)
1.创建资源类,在资源类中创建属性和方法。3.创建多个线程,调用资源类的方法。2.在资源类上操作方法。原创 2022-08-03 22:34:34 · 120 阅读 · 0 评论 -
多线程 之 线程池1
一 线程池1.1 概念线程池(英语:thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。1.2 优点1.降低资源消耗: 通过重复利用已创建的线程降低线程创建和销毁造成的销耗。2.提高响应速度: 当任务到达时,任务可以不需要等待线程创建就能立即执行。3.提高线程的可管理性: 线程是原创 2022-05-08 19:38:07 · 722 阅读 · 2 评论 -
多线程中线程池常见7个参数的详解以及执行流程
一 线程池常见参数1.1 概念1.2 coresize和maxsize,poolsize1.corePoolSize:线程池的基本大小,即在没有任务需要执行的时候线程池的大小,并且只有在工作队列满了的情况下才会创建超出这个数量的线程。2.maximumPoolSize:线程池中允许的最大线程数3.poolSize:线程池中当前线程的数量3者之间的关系:新提交一个任务时的处理流程很明显:1、如果当前线程池的线程数还没有达到基本大小(poolSize ..原创 2021-08-08 00:07:54 · 6823 阅读 · 2 评论 -
static synchronized方法和synchronized方法的区别和联系-2(class锁和对象锁,不同锁,混合访问时)
package com.ljf.mianshi.demo.mainshithread;public class TestJd { public static void main(String args[]){ JDSB jdsb=new JDSB(); JDSB jdsb2=new JDSB(); new Thread(new Thre...原创 2020-04-30 23:02:21 · 219 阅读 · 0 评论 -
static synchronized方法和synchronized方法的区别和联系-1(相同锁下的访问比较)
一 synchronized修饰的普通方法---------访问同一个对象实例package com.ljf.mianshi.demo.mainshithread;public class TestJd { public static void main(String args[]){ JDSB jdsb=new JDSB(); JDSB jds...原创 2020-04-30 20:22:16 · 542 阅读 · 0 评论 -
线程池的执行流程
列举一个线程池max=6,core=3,任务队列taskQueue=5;采用饱和策略为1)则我们看看提交任务给此线程池的执行逻辑如下:1)首先我们提交第一个任务到线程池,此时核心线程数都还没有用,所以会启动核心线程之一来执行任务2)接着提交第二个第三个任务到线程池,他们的执行逻辑同第一个任务是一模一样的,线程池会启动核心线程池中剩下的两个线程来执行你新提交的任务。3)接着又有新的任...原创 2019-02-14 18:04:47 · 3673 阅读 · 3 评论 -
多线程JUC 第2季 实现生产者消费者通信机制
知识点:多线程之间的通信;代码:public class Resources { public static int count=0; public static boolean flag=false;}public class Producer implements Runnable { public Resources res; pu...原创 2019-01-20 12:20:09 · 331 阅读 · 1 评论 -
有三个线程分别打印A、B、C,请用多线程编程实现,在屏幕上循环打印10次ABCABC…
题目:有三个线程分别打印A、B、C,请用多线程编程实现,在屏幕上循环打印10次ABCABC… 方法一:使用lock和condition来实现a执行完通知b执行,b执行完通知c执行,c执行完通知a执行的顺序,使用Executors的fixedthreadpool,将三个线程放到线程池里面,使用线程池控制程序的结束,调用shutdown()方法。package com.ljf.thread....原创 2019-01-27 10:49:27 · 5593 阅读 · 1 评论 -
使用lock实现多线程并发访问
一.主类package com.ljf.thread.demo.lock;public class LockDemo { public static void main(String args[]){ LockA la=new LockA(); new Thread(la,"a").start(); new Thread(la,"b")....原创 2019-01-27 10:32:58 · 344 阅读 · 0 评论 -
java中yield 和join的作用
1.yeild作用:当前线程从运行状态变为可执行状态,放弃当前cpu的资源,将它让给其他任务,包括自己,去占用cpu的执行时间,放弃的时间不确定,有可能刚刚放弃,马上又获得cpu的时间片。只能使同优先级或者高优先级的线程得到执行机会。cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不是说一定会执行其他线程而该线程在下一次中不会执行到了。2...原创 2019-01-20 16:26:10 · 1569 阅读 · 2 评论 -
多线程JUC 第2季 四种线程池的比较
1.代码逻辑说明2.代码3.结果。原创 2019-01-20 15:48:01 · 435 阅读 · 0 评论 -
使用countdownlatch和线程池fixedThreadPool实现任务的分发执行
业务逻辑要求:每次调用多个任务,将任务分发给多个子线程,实现并行执行。本代码使用缓存线程池cacheThreadPool初始化多个线程,使用countdownlatch做子线程的计数控制,当子线程执行完,释放执行权,交给主线程,开始下一轮的执行。话不多说:上代码package com.test.thread;import java.util.ArrayList;import jav...原创 2019-01-07 16:45:14 · 1494 阅读 · 0 评论