- 概述
三种性质
可见性:一个线程对共享变量的修改,另一个线程能立刻看到。缓存可导致可见性问题。
原子性:一个或多个CPU执行操作不被中断。线程切换可导致原子性问题。
有序性:编译器优化可能导致指令顺序发生改变。编译器优化可能导致有序性问题。
三个问题
安全性问题:线程安全
活跃性问题:死锁、活锁、饥饿
性能问题:
使用无锁结构:TLS,Copy-On-Write,乐观锁;Java的原子类,Disruptor无锁队列
减少锁的持有时间:让锁细粒度。如ConcurrentHashmap;再如读写锁,读无锁写有锁
2. Java内存模型
volatile
C语言中的原意:禁用CPU缓存,从内存中读出和写入。
Java语言的引申义:
Java会将变量立刻写入内存,其他线程读取时直接从内存读(普通变量改变后,什么时候写入内存是不一定的)
禁止指令重排序
解决问题:
保证可见性
保证有序性
不能保证原子性
Happens-Before规则(H-B)
程序顺序性规则:前面执行的语句对后面语句可见
volatile变量规则:volatile变量的写操作对后续的读操作可见
传递性规则:A H-B B,B H-B C,那么A H-B C
管程中锁的规则:对一个锁的解锁 H-B于 后续对这个锁的加锁
3. 互斥锁sychronized
锁对象:非静态this,静态Class,括号Object参数
预防死锁:
互斥:不能破坏
占有且等待:同时申请所有资源
不可抢占:sychronized解决不了,Lock可以解决
循环等待:给资源设置id字段,每次都是按顺序申请锁
等待通知机制:
wait、notify、notifyAll
想具体学习,查看资料
链接: https://pan.baidu.com/s/1I6LFG13BU2QN3X3_IQpGtg?pwd=dgr5 提取码: dgr5
–来自百度网盘超级会员v3的分享