随笔分类 - java并发编程
摘要:管程和信号量这两个同步原语在 Java 语言中的实现,理论上用这两个同步原语中任何一个都可以解决所有的并发问题。那 Java SDK 并发包里为什么还有很多其他的工具类呢?原因很简单:分场景优化性能,提升易用性。 其中有个非常普遍的并发场景:读多写少场景。实际工作中,为了优化性能,我们经常会使用缓存
阅读全文
posted @ 2019-10-25 11:52
45°仰望星空
摘要:推荐并发大师 Doug Lea《Java 并发编程:设计原则与模式》一书。 用锁的最佳实践: 永远只在更新对象的成员变量时加锁; 永远只在访问可变的成员变量时加锁; 永远不在调用其他对象的方法时加锁。 tryLock()方法相关参考: https://www.cnblogs.com/donefive
阅读全文
摘要:方法调用栈结构: 每个线程都有自己独立的方法调用栈: 这种局部变量不共享,从而保证线程安全的技术,称为线程封闭技术。 案例:数据库连接池。采用线程封闭技术,线程获取的数据库连接connection,是独立的,在这个线程在关闭获取的这个connection之前,不会再分配给其他线程。 思考:递归调用太
阅读全文
摘要:1、为什么要使用多线程? 性能的核心指标: 延迟,指的是发送请求到收到响应的过程的耗时。延迟越短,程序执行时间越短,性能越好。 吞吐量,指的是单位时间能够处理的请求数。吞吐量越大,意味着程序能处理的请求越多,性能也就越好。 所以,要提升性能,就是要 降低程序的延迟。提高程序的吞吐量。 两个方向:1.
阅读全文
摘要:一、java线程生命周期 处于休眠状态(blocked、waiting、timed_waiting)的线程,没有CPU的使用权。 二、Runnable状态和休眠状态之间的状态转换 三、Runnable状态到Terminated状态 线程执行完run()方法后,会自动切换到terminated状态;
阅读全文
posted @ 2019-10-21 15:16
45°仰望星空
摘要:所谓管程,指的是管理共享变量以及对共享变量的操作过程,让他们支持并发。 1.管程是一种概念,任何语言都可以通用。2.在java中,每个加锁的对象都绑定着一个管程(监视器)3.线程访问加锁对象,就是去拥有一个监视器的过程。如一个病人去门诊室看医生,医生是共享资源,门锁锁定医生,病人去看医生,就是访问医
阅读全文
摘要:不能用账户余额this.balance和this.password做为锁对象。 这两个对象都是可变对象,一但对他们进行赋值就会变成新的对象,加的锁就失效了。不能把可变的对象当成一把锁 Integer String Boolean相关的知识:Integer会缓存-128~127这个范围内的数值,Str
阅读全文
摘要:死锁现象: 最常见的就是转账操作:B转A的同时,A转账给B,那么先锁B再锁A,但是,另一个线程是先锁A再锁B,然而,如果两个线程同时执行,那么就是出现死锁的情况,线程T1锁了A请求锁B,此时线程T2锁了B请求锁A,都在等着对方释放锁,然而自己都不会释放锁,故死锁。 死锁发生的条件: 占用且等待; 已
阅读全文
posted @ 2019-10-17 15:05
45°仰望星空
摘要:并发编程的两个问题:缓存导致的不可见,编译优化导致的有序性问题 解决:禁用缓存,禁用编译优化。但是总不能所有程序都禁用吧,这样程序的性能就堪忧了。 Java内存模型:按需禁用缓存,禁用编译优化。 从本质上来讲,Java内存模型规范了JVM如何提供按需禁用缓存和编译优化的方法。具体来说,这些方法包括v
阅读全文
摘要:一、可见性 是指多线程在不同cpu缓存(多核)中对同一个变量进行修改,导致的不可见 二、原子性 指线程间切换导致的原子性问题 一条编程语句执行往往包含多条CPU指令,操作系统做任务切换,可以发生在任意一条cpu指令执行完 比如count+=1;这条语句包含3条cpu指令: 1.把变量count从内存
阅读全文
摘要:在32位的机器上对long型变量进行加减操作存在并发隐患的说法是正确的。 原因就是:线程切换带来的原子性问题。 非volatile类型的long和double型变量是8字节64位的,32位机器读或写这个变量时得把人家咔嚓分成两个32位操作,可能一个线程读了某个值的高32位,低32位已经被另一个线程改
阅读全文

浙公网安备 33010602011771号