摘要: 1. 定义 要点 与Java并发(二十二) 同步模式之保护性暂停中的保护性暂停中的 GuardObject 不同,不需要产生结果和消费结果的线程一一对应 这样的好处是消费队列可以用来平衡生产和消费的线程资源 生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据 消息队列是有容量限 阅读全文
posted @ 2024-04-17 21:54 |旧市拾荒| 阅读(28) 评论(0) 推荐(0) 编辑
摘要: 1、join 是调用者轮询检查线程 alive 状态,执行后线程进入阻塞状态。 如在线程B中调用线程A的join(),那线程B会进入到阻塞队列,直到join结束或中断线程B才开始进入阻塞队列。可以实现一个线程的顺序执行。 t1.join(); 等价于下面的代码 synchronized (t1) { 阅读全文
posted @ 2024-04-07 20:30 |旧市拾荒| 阅读(21) 评论(0) 推荐(0) 编辑
摘要: 1、定义 即 Guarded Suspension,用在一个线程等待另一个线程的执行结果 要点 有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject 如果有结果不断从一个线程到另一个线程那么可以使用消息队列 JDK 中,join 的实现、Future 的实现,采用的 阅读全文
posted @ 2024-02-04 20:31 |旧市拾荒| 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 开始之前先看看,sleep(long n) 和 wait(long n) 的区别: 1) sleep 是 Thread 的静态方法,而 wait 是 Object 的方法 2) sleep 不需要强制和 synchronized 配合使用,但 wait 需要和 synchronized 一起用 3) 阅读全文
posted @ 2024-01-11 21:45 |旧市拾荒| 阅读(196) 评论(1) 推荐(1) 编辑
摘要: 1、小故事 - 为什么需要 wait 由于条件不满足(没烟干不了活啊,等小M把烟送过来),小南不能继续进行计算 但小南如果一直占用着锁,其它人就得一直阻塞,效率太低 于是老王单开了一间休息室(调用 wait 方法),让小南到休息室(WaitSet)等着去了,但这时锁释放开,其它人可以由老王随机安排进 阅读全文
posted @ 2023-12-25 22:19 |旧市拾荒| 阅读(180) 评论(0) 推荐(1) 编辑
摘要: 1、小故事 故事角色 老王 - JVM 小南 - 线程 小女 - 线程 房间 - 对象 房间门上 - 防盗锁 - Monitor-重量级锁 房间门上 - 小南书包 - 轻量级锁 房间门上 - 刻上小南大名 - 偏向锁 -对象专属于某个线程使用 批量重刻名 - 一个类的偏向锁撤销到达 20 阈值 -批 阅读全文
posted @ 2023-12-19 21:00 |旧市拾荒| 阅读(289) 评论(0) 推荐(2) 编辑
摘要: 1、Java 对象头 以 32 位虚拟机为例 普通对象 | | | Object Header (64 bits) | | | | | Mark Word (32 bits) | klass Word (32 bits) | | | | 数组对象 | | | Object Header (96 bi 阅读全文
posted @ 2023-12-17 21:00 |旧市拾荒| 阅读(95) 评论(0) 推荐(0) 编辑
摘要: 1、常见线程安全类 String Integer StringBuffer Random Vector Hashtable java.util.concurrent (JUC)包下的类 这里说它们是线程安全的是指,多个线程调用它们同一个实例的某个方法时,是线程安全的。 Hashtable table 阅读全文
posted @ 2023-12-12 21:19 |旧市拾荒| 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 1、成员变量和静态变量是否线程安全 如果它们没有共享,则线程安全 如果它们被共享了,根据它们的状态是否能够改变,又分两种情况 如果只有读操作,则线程安全 如果有读写操作,则这段代码是临界区,需要考虑线程安全 2、局部变量是否线程安全 局部变量是线程安全的 但局部变量引用的对象则未必 如果该对象没有逃 阅读全文
posted @ 2023-12-10 21:41 |旧市拾荒| 阅读(282) 评论(0) 推荐(2) 编辑
摘要: 所谓的“线程八锁” 其实就是看 synchronized 锁住的是哪个对象 情况1:12 或 21都是有可能的,就看cpu先调度哪个线程 @Slf4j(topic = "c.Number") class Number{ public synchronized void a() { log.debug 阅读全文
posted @ 2023-12-02 11:55 |旧市拾荒| 阅读(70) 评论(0) 推荐(0) 编辑
摘要: 为了避免临界区的竞态条件发生,有多种手段可以达到目的。 阻塞式的解决方案:synchronized,Lock 非阻塞式的解决方案:原子变量 此次介绍使用阻塞式的解决方案:synchronized,来解决上述问题,即俗称的【对象锁】,它采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】,其它线程 阅读全文
posted @ 2023-08-30 22:02 |旧市拾荒| 阅读(89) 评论(0) 推荐(0) 编辑
摘要: 1. 悲观互斥 互斥实际是悲观锁的思想 例如,有下面取款的需求 interface Account { // 获取余额 Integer getBalance(); ​ // 取款 void withdraw(Integer amount); ​ /** * 方法内会启动 1000 个线程,每个线程做 阅读全文
posted @ 2023-07-27 20:10 |旧市拾荒| 阅读(28) 评论(0) 推荐(0) 编辑
摘要: 1、小故事 老王(操作系统)有一个功能强大的算盘(CPU),现在想把它租出去,赚一点外快 小南、小女(不同的线程)来使用这个算盘来进行一些计算,并按照时间给老王支付费用 但小南不能一天24小时使用算盘,他经常要小憩一会(sleep),又或是去吃饭上厕所(阻塞 io 操作),有时还需要一根烟,没烟时思 阅读全文
posted @ 2023-07-26 20:19 |旧市拾荒| 阅读(48) 评论(0) 推荐(0) 编辑
摘要: 1、背景 统筹方法,是一种安排工作进程的数学方法。它的实用范围极广泛,在企业管理和基本建设中,以及关系复杂的科研项目的组织与管理中,都可以应用。 怎样应用呢?主要是把工序安排好。 比如,想泡壶茶喝。当时的情况是:开水没有;水壶要洗,茶壶、茶杯要洗;火已生了,茶叶也有了。怎么办? 办法甲:洗好水壶,灌 阅读全文
posted @ 2023-06-27 21:23 |旧市拾荒| 阅读(291) 评论(0) 推荐(0) 编辑
摘要: 1、五种状态 这是从 操作系统 层面来描述的 【初始状态】仅是在语言层面创建了线程对象,还未与操作系统线程关联 【可运行状态】(就绪状态)指该线程已经被创建(与操作系统线程关联),可以由 CPU 调度执行 【运行状态】指获取了 CPU 时间片运行中的状态 当 CPU 时间片用完,会从【运行状态】转换 阅读全文
posted @ 2023-06-15 20:06 |旧市拾荒| 阅读(245) 评论(0) 推荐(0) 编辑