多线程学习笔记

volatile 和 synchronized
–都可以保证线程间的可见性,原子性
–synchronized 还可以实现可重入锁 和 互斥性

CPU执行指令很快,但执行指令的过程中,需要有一些临时数据的操作,这些临时数据存储在主内存(物理内存),读取/写入的速度跟不上CPU的执行速度,这样大大降低了CPU执行指令的速度(因为需要等待数据的读取/写入)
所以在CPU中开辟了一个高速缓存(一个线程划出一个缓存区),将主内存的临时数据复制一份到高速缓存中,这样CPU在执行指令的时候直接操作高速缓存,性能可以得到很大的提升
当运算结束后,会将高速缓存的结果刷新到主内存中(在这期间,数据的改变,别的线程无法得知)

JMM(java memory model)–java内存模型
–在主内存中,有一些共享内存,java多线程情况下,每个线程加载一份共享内存保存在该线程内存中,这样能够加快读取速度
–但是有一个坏处就是当一个线程修改了共享变量时,无法同步到另一个线程,另一个线程操作的共享变量还是老的变量
–解决方法: 使用 volatile(synchronized)修饰变量,可以使得变量拥有线程可见性,这样一个线程改动变量,另一个线程就可以拿到新的变量
–原理:一个线程修改变量,然后会把该变量同步到主内存,然后另一个线程在操作变量的时候,发现变量的内存地址变了,然后就会更新变量的值,达到同步作用(未修饰volatile,变量同步到主内存时间是不确定的,所以会造成数据的不安全)

volatile 不能做复合操作的原子性
–禁止指令重排
–多线程保证可见性(强制将修改的值立即写入主存)

Lock(jdk5 引入的,在java.util.concurrent.locks 包下) 和 synchronized 的区别
1、synchronized 什么时候释放?
1)、当synchronized修饰的代码块执行完了
2)、当synchronized修饰的代码块出现异常了

2、Lock 和 synchronized 的选择:在竞争不激烈的时候,两者的性能差不多,但是在锁的竞争激烈的时候,Lock的性能优于synchronized(java 6 之后synchronized 做了很多优化,所以总体两者性能差不多)

Lock 可以主动释放锁
synchronized 是被动的

3、锁的种类(可查看juc包)
可重入锁 ReentrantLock、synchronized
读写锁 ReadWriteLock
公平锁
可中断锁
可重入读写锁 ReentrantReadWriteLock

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值