Java并发
文章平均质量分 60
Java并发知识学习记录
|旧市拾荒|
三年工作经验,任职于某银行科技部门,从事后端开发与数据开发。
展开
-
Java并发(二十五)----异步模式之生产者/消费者
要点与Java并发(二十二)----同步模式之保护性暂停中的保护性暂停中的 GuardObject 不同,不需要产生结果和消费结果的线程一一对应这样的好处是消费队列可以用来平衡生产和消费的线程资源生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据JDK 中各种阻塞队列,采用的就是这种模式。原创 2024-04-17 21:54:50 · 186 阅读 · 0 评论 -
Java并发(二十四)----wait、notify、notifyAll、join区别与联系
当调用notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程能够获取锁标志;3、调用wait()后必须调用notify()或notifyAll()后线程才会从等待池进入到锁池,当我们的线程竞争得到同步锁后就会重新进入绪状态等待cpu资源分配。如在线程B中调用线程A的join(),那线程B会进入到阻塞队列,直到join结束或中断线程B才开始进入阻塞队列。notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。原创 2024-04-07 20:31:14 · 448 阅读 · 0 评论 -
Java并发(二十三)----同步模式之保护性暂停
即 Guarded Suspension,用在一个线程等待另一个线程的执行结果要点有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject如果有结果不断从一个线程到另一个线程那么可以使用消息队列JDK 中,join 的实现、Future 的实现,采用的就是此模式因为要等待另一方的结果,因此归类到同步模式。原创 2024-02-04 20:32:13 · 433 阅读 · 0 评论 -
Java并发(二十二)----wait notify的正确姿势
开始之前先看看,和的区别:1) sleep 是 Thread 的静态方法,而 wait 是 Object 的方法2) sleep 不需要强制和 synchronized 配合使用,但 wait 需要和 synchronized 一起用3) sleep 在睡眠的同时,不会释放对象锁的,但 wait 在等待的时候会释放对象锁4) 它们状态 TIMED_WAITING建议:锁对象加final修饰,这样锁对象不可变。原创 2024-01-11 21:44:57 · 507 阅读 · 0 评论 -
Java并发(二十一)----wait notify介绍
obj.wait()让进入 object 监视器的线程到 waitSet 等待在 object 上正在 waitSet 等待的线程中挑一个唤醒让 object 上正在 waitSet 等待的线程全部唤醒它们都是线程之间进行协作的手段,都属于 Object 对象的方法。必须获得此对象的锁,才能调用这几个方法,否则会报IllegalMonitorStateExceptionlog.debug("执行....");// 让线程在obj上一直等待下去。原创 2023-12-25 22:19:22 · 498 阅读 · 1 评论 -
Java并发(二十)----synchronized原理进阶
是因为Java中有一个JIT(即时编译器),会对于反复执行的代码进行优化,b中o对象根本不会被共享,所以b中的synchronized是没有任何意义的,所以Java就把锁给消除了。小南和小女商量了一下,约定不锁门了,而是谁用房间,谁把自己的书包挂在门口,但他们的书包样式都一样,因此每次进门前得翻翻书包,看课本是谁的,如果是自己的,那么就可以进门,这样省的上锁解锁了。于是,小南干脆在门上刻上了自己的名字:【小南专属房间,其它人勿用】,下次来用房间时,只要名字还在,那么说明没人打扰,还是可以安全地使用房间。原创 2023-12-19 21:00:47 · 963 阅读 · 0 评论 -
Java并发(十九)----Monitor原理及Synchronized原理
每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头的 Mark Word 中就被设置指向 Monitor 对象的指针。在 Thread-2 上锁的过程中,如果 Thread-3,Thread-4,Thread-5 也来执行 synchronized(obj),就会进入 EntryList BLOCKED。Thread-2 执行完同步代码块的内容,然后唤醒 EntryList(阻塞队列) 中等待的线程来竞争锁,竞争是非公平的。原创 2023-12-17 21:01:51 · 564 阅读 · 0 评论 -
Java并发(十八)----常见线程安全类及实例分析
或许有疑问,String 有 replace,substring 等方法【可以】改变值啊,那么这些方法又是如何保证线程安全的呢?String、Integer 等都是不可变类,因为其内部的状态不可以改变,因此它们的方法都是线程安全的。原因为,原值并没有被改变,而是创建了一个新值,其内部的状态没有改变,因此它们的方法都是线程安全的。这里说它们是线程安全的是指,多个线程调用它们同一个实例的某个方法时,是线程安全的。其中 foo 的行为是不确定的,可能导致不安全的发生,被称之为。它们的每个方法是原子的。原创 2023-12-12 21:19:43 · 566 阅读 · 0 评论 -
Java并发(十七)----变量的线程安全分析
情况2:在 情况1 的基础上,为 ThreadSafe 类添加子类,子类覆盖 method2 或 method3 方法,即。因为method3新开了一个线程,造成多个线程访问同一个共享资源,就会存在线程安全的问题。每个线程调用 test1() 方法时局部变量 i,会在每个线程的栈帧内存中被创建多份,因此不存在共享。无论哪个线程中的 method2 引用的都是同一个对象中的 list 成员变量。如果它们被共享了,根据它们的状态是否能够改变,又分两种情况。如果该对象没有逃离方法的作用访问,它是线程安全的。原创 2023-12-10 21:41:30 · 446 阅读 · 0 评论 -
Java并发(十六)----线程八锁
3 1s后 12 、 23 1s后 1 、 32 1s后 1。,没有互斥,同时运行,2先打印,sleep 1秒后打印1。,锁住的对象不同,所以和题4一样,不存在互斥。,锁住的对象不同,所以和题4一样,不存在互斥。,锁着的同一个对象,还是看cpu先调度哪个线程。,3肯定是最开始的打印的,就看1或2谁先打印。都是有可能的,就看cpu先调度哪个线程。1s 后12, 或 2 1s后 1。1s 后12, 或 2 1s后 1。1s后12,或 2 1s后 1。,还是看cpu先调度哪个线程。,还是看cpu先调度哪个线程。原创 2023-12-02 11:54:48 · 453 阅读 · 0 评论 -
Java并发(十五)----synchronized解决共享的问题
为了避免临界区的竞态条件发生,有多种手段可以达到目的。阻塞式的解决方案:synchronized,Lock非阻塞式的解决方案:原子变量此次介绍使用阻塞式的解决方案:synchronized,来解决上述问题,即俗称的【对象锁】,它采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】,其它线程再想获取这个【对象锁】时就会阻塞住。这样就能保证拥有锁的线程可以安全的执行临界区内的代码,不用担心线程上下文切换。原创 2023-08-30 22:03:47 · 289 阅读 · 0 评论 -
Java并发(十四)----悲观互斥与乐观重试
另外一种是乐观锁思想,它其实不是互斥。互斥实际是悲观锁的思想。例如,有下面取款的需求。原创 2023-07-27 20:10:17 · 207 阅读 · 0 评论 -
Java并发(十三)----共享存在的问题
一个程序运行多个线程本身是没有问题的问题出在多个线程访问共享资源多个线程读共享资源其实也没有问题在多个线程对共享资源读写操作时发生指令交错,就会出现问题一段代码块内如果存在对共享资源的多线程读写操作,称这段代码块为临界区原创 2023-07-26 20:19:26 · 190 阅读 · 0 评论 -
Java并发(十二)----线程应用之多线程解决烧水泡茶问题
统筹方法,是一种安排工作进程的数学方法。它的实用范围极广泛,在企业管理和基本建设中,以及关系复杂的科研项目的组织与管理中,都可以应用。怎样应用呢?主要是把工序安排好。比如,想泡壶茶喝。当时的情况是:开水没有;水壶要洗,茶壶、茶杯要洗;火已生了,茶叶也有了。怎么办?办法甲:洗好水壶,灌上凉水,放在火上;在等待水开的时间里,洗茶壶、洗茶杯、拿茶叶;等水开了,泡茶喝。办法乙:先做好一些准备工作,洗水壶,洗茶壶茶杯,拿茶叶;一切就绪,灌水烧水;坐待水开了,泡茶喝。办法丙:洗净水壶,灌上凉水,放在原创 2023-06-27 21:25:35 · 364 阅读 · 1 评论 -
Java并发(十一)----线程五种状态与六种状态
【初始状态】仅是在语言层面创建了线程对象,还未与操作系统线程关联【可运行状态】(就绪状态)指该线程已经被创建(与操作系统线程关联),可以由 CPU 调度执行【运行状态】指获取了 CPU 时间片运行中的状态当 CPU 时间片用完,会从【运行状态】转换至【可运行状态】,会导致线程的上下文切换【阻塞状态】如果调用了阻塞 API,如 BIO 读写文件,这时该线程实际不会用到 CPU,会导致线程上下文切换,进入【阻塞状态】等 BIO 操作完毕,会由操作系统唤醒阻塞的线程,转换至【可运行状态】原创 2023-06-15 20:08:05 · 551 阅读 · 0 评论 -
Java并发(十)----线程之守护线程
默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。Tomcat 中的 Acceptor 和 Poller 线程都是守护线程,所以 Tomcat 接收到 shutdown 命令后,不会等待它们处理完当前请求。垃圾回收器线程就是一种守护线程。原创 2023-06-15 20:07:26 · 224 阅读 · 0 评论 -
Java并发(九)----线程join、interrupt
stop 方法会真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释放锁, 其它线程将永远无法获取锁。注意:这个打断标记只是一个标记信号,并不会结束线程的执行,一般是根据这个标记信号来决定是否结束当前线程。正常运行状态的如果打断,那么打断标记为true,如果是阻塞状态被打断,那么其打断状态为false。interrupt 可以打断正在执行的线程,无论这个线程是在 sleep,wait,还是正常运行。因为主线程和线程 t1 是并行执行的,t1 线程需要 1 秒之后才能算出。原创 2023-06-01 22:45:43 · 653 阅读 · 0 评论 -
Java并发(八)----使用线程避免cpu占用100%
在没有利用 cpu 来计算时,不要让 while(true) 空转浪费 cpu,这时。不同的是,后两种都需要加锁,并且需要相应的唤醒操作,一般适用于要进行同步的场景。可以用 wait 或 条件变量达到类似的效果。sleep 适用于无需锁同步的场景。原创 2023-06-01 22:40:32 · 303 阅读 · 0 评论 -
Java并发(七)----线程sleep、yield、线程优先级
2.是否考虑线程优先级:sleep方法不会考虑线程优先级,当一个线程调用sleep方法释放CPU后,所有优先级级别的线程都有机会获得CPU。当一个线程调用sleep方法释放CPU后,与该线程具有同等优先级,或优先级比该线程高的线程有机会获得CPU。5.是否有参数:sleep方法在Thread类中有两种重载形式,sleep(long ms),sleep(long ms,int nanos)yield方法没有参数。如果 cpu 比较忙,那么优先级高的线程会获得更多的时间片,但 cpu 闲时,优先级几乎没作用。原创 2023-05-30 22:01:35 · 654 阅读 · 0 评论 -
Java并发(六)----线程start、run、state方法
使用 start 是启动新的线程,通过新的线程间接执行 run 中的代码。直接调用 run 是在主线程中执行了 run,没有启动新的线程。程序仍在 main 线程运行,程序在 t1 线程运行,原创 2023-05-15 19:26:47 · 139 阅读 · 1 评论 -
Java并发(五)----线程常见方法总结
线程常见方法总结原创 2023-05-15 19:25:19 · 457 阅读 · 0 评论 -
Java并发(四)----线程运行原理
我们都知道 JVM 中由堆、栈、方法区所组成,其中栈内存是给谁用的呢?其实就是线程,每个线程启动后,虚拟机就会为其分配一块栈内存。每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法原创 2023-05-05 22:14:41 · 472 阅读 · 0 评论 -
Java并发(三)----创建线程的三种方式及查看进程线程
FutureTask (未来任务)能够接收 Callable 类型的参数,用来处理有返回结果的情况。查看某个 Java 进程(PID)的所有线程状态 ,只能查看某一刻某个进程所有线程较详细的状态。方法1 是把线程和任务合并在了一起,方法2 是把线程和任务分开了。查看某个进程(PID)的所有线程,可持续查看线程的状态。Runnable 可运行的任务(线程要执行的代码)任务管理器可以查看进程和线程数,也可以用来杀死进程。把【线程】和【任务】(要执行的代码)分开。查看某个进程(PID)的所有线程。原创 2023-04-24 22:08:33 · 1428 阅读 · 0 评论 -
Java并发(二)----初次使用多线程并行提高效率
IO 操作不占用 cpu,只是我们一般拷贝文件使用的是【阻塞 IO】,这时相当于线程虽然不用 cpu,但需要一直等待 IO 结束,没能充分利用线程。但如果是四核 cpu,各个核心分别使用线程 1 执行计算 1,线程 2 执行计算 2,线程 3 执行计算 3,那么 3 个线程是并行的,花费时间只取决于最长的那个线程运行的时间,即。单核 cpu 下,多线程不能实际提高程序运行效率,只是为了能够在不同的任务之间切换,不同线程轮流使用 cpu ,不至于一个线程总占用 cpu,别的线程没法干活。原创 2023-04-13 21:56:15 · 992 阅读 · 0 评论 -
Java并发(一)----进程、线程、并行、并发
操作系统中有一个组件叫做任务调度器,将 cpu 的时间片(windows 下时间片最小约为 15 毫秒)分给不同的线程使用,只是由于 cpu 在线程间(时间片很短)的切换非常快,人类感觉是。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)都可以调度运行线程,这时候线程可以是并行的。不同计算机之间的进程通信,需要通过网络,并遵守共同的协议,例如 HTTP。进程基本上相互独立的,而线程存在于进程内,是进程的一个子集。原创 2023-04-10 20:45:30 · 413 阅读 · 0 评论