并发编程
文章平均质量分 61
梦想远航
既往不恋,纵情向前
展开
-
详解生产者消费者问题 wait notify 附生产者唤醒生产者程序运行不下去的问题
生产者和消费者是线程间进行通信的典型例子。实质是多线程共同操作一缓冲队列。Synchronized + wait() notify() 实现,引出一个问题 notify只负责唤醒所在对象的阻塞线程中的一个。被唤醒的线程进入可运行状态,等待cpu时间片。 notifyAll负责唤醒所在对象的所有阻塞线程,即所有因为对象阻塞的线程处于唤醒状态,其中一个线程会获得锁,当该线程退出后,其他线程继原创 2018-01-21 23:21:57 · 540 阅读 · 0 评论 -
final域 内存语义 保证可见性
final域 内存模型保障构造函数中对象不溢出的情况下,其他线程拿到的是初始化后的final 对象。原创 2019-03-09 10:38:47 · 1460 阅读 · 0 评论 -
Synchronized锁 偏向锁 锁优化
Synchronized实现同步同步普通方法,锁当前实例对象同步静态方法,锁当前类的Class对象同步方法块,锁是Synchronized()里配置的对象Synchronized在JVM中的实现原理JVM基于进入和退出Monitor对象来实现同步。编译后插入monitorenter到同步代码块开始的位置,monitorexit插入到方法结束处和异常处。monitor被持有后,...原创 2019-03-03 11:33:32 · 605 阅读 · 0 评论 -
并发编程的艺术 读书笔记
第一章 并发编程的挑战1. 单核CPU分配运行时间给各个线程,实现多线程执行代码。举例:看英文书时某个单词不会,先记住看到书的页数和行数,然后去查单词,查完回到看书状态,相当于上下文切换。2.多线程并不一定比串行执行代码快举例:循环累加的代码,count=10000时,并发比串行执行慢。public class ConcurrencyTest { private static f...原创 2019-02-28 20:59:01 · 334 阅读 · 0 评论 -
多线程总结 线程池 线程通信
一、上下文切换 《Java并发编程的艺术》 即使是单核CPU也支持多线程执行代码,CPU通过给给个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间非常短,CPU通过不停的切换线程执行,让我们感觉多个线程同时执行的。 CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时...原创 2018-07-20 22:35:09 · 336 阅读 · 0 评论 -
Java并发包 AQS
参考https://github.com/CyC2018/Interview-Notebook/blob/master/notes/Java%20%E5%B9%B6%E5%8F%91.md#%E4%B8%83juc—aqsCountdownLatch 用来控制一个线程等待多个线程。 维护了一个计数器 cnt,每次调用 countDown() 方法会让计数器的值减 1,减到 0 的时候,那些...原创 2018-07-01 21:59:09 · 263 阅读 · 0 评论 -
并发编程的艺术 volatile关键字 JMM 重排序
Volatile保证可见性,在工作内存中,每次使用volatile变量都必须先从主内存刷新最新值,使用后立刻同步回主内存(volatile变量依然有工作内存的拷贝,但由于它特殊的操作顺序(每次使用前都需要刷新),所以看起来如同直接在主内存中读写访问一般)(将use和load动作相关联,即use前必须是load,load后必须是use;将assign和store相关联,即store前必须是assig...原创 2018-05-21 22:00:29 · 254 阅读 · 0 评论 -
多线程 程序完成指定任务,开启多少并发线程最合适
首先要考虑执行的任务是什么类型: 1、IO密集型 2、计算密集型IO密集型:以大量任务读写数据库,读写文件为主,内存中的运算很少,线程基本阻塞在IO上面。这种情况下,尽量多开启一些线程并发做IO操作,因为在IO过程中,CPU几乎是闲置的。 计算密集型:任务以内存中的计算为主。这时候CPU是满负荷工作,即使开再多的线程,只会徒增线程上下午切换的成本。这种情况下,CPU是几核,就开几个线程。...原创 2018-05-14 12:26:14 · 3387 阅读 · 0 评论 -
CAS机制
乐观锁用到了CAS机制并发包中的原子类也用到了CAS机制 三个值 内存上的值V,旧的预期值A,期望修改的值B。 要写回B之前先判断A和V是否相同。 问题会有ABA问题。在并发量很大的情况下效果反而不好,所有线程竞争激烈,一直在反复修改提交,占用CPU资源。...原创 2018-04-17 09:54:51 · 306 阅读 · 0 评论 -
详解生产者消费者问题 lock newCondition的方法 附加代码 和遇到的问题详解
这里用到了Lock锁机制,newCondition能为多个线程提供不同的condition,详情见代码,特定的condition能唤醒特定的线程。相比synchronized同步方法的notifyAll,多了多个等待队列,notifyAll所有的线程都会唤醒,notify只能唤醒一个线程,有可能生产者线程唤醒的是生产者线程。对于condition来说,我们将其分成生产者线程和消费者线程,在生产者线程原创 2018-01-22 16:18:59 · 6303 阅读 · 1 评论 -
线程的状态
Java线程在运行的生命周期中可能处于6中不同的状态。线程变迁图如下所示:我觉得并发编程的艺术中图画的不太好,在运行态中,上面是运行中RUNNING,下面是就绪READY状态,这样画容易引起歧义。让人以为执行start()方法后,会进入运行态中的RUNNING状态。其实不是的,start()方法后,是进入READY就绪状态,等待CPU分配执行时间,也就是从下到上的“系统调度”。在本文总结中将R...原创 2019-03-07 11:29:08 · 155 阅读 · 0 评论