Java并发编程--学会他就能抵挡千军万马

java并发主要依赖于JVM和cpu指令
java对象锁 3种
1.普通同步方法,锁是当前实例对象
2.对于静态同步方法,锁是当前类的class对象
3.对于同步代码块,锁是synchronized括号李配置的对象
synchronized的底层原理,在jvm层面调用时monitorenter指令获取锁,monitorexit释放锁。每个对象都有一个对应的monitor监视器关联,监视器被占用就是当前锁被占用,monitor中的owner方法是当前拥有锁的线程。recursions获取锁次数。monitor是存在java对象头中的。
面试中经常问到的 Synchronized和Lock锁的区别?
1.synchronized是关键字,lock是接口
2.synchronized自动释放锁,lock手动释放锁
3.synchronized不可中断,lock可以中断
4lock能调用trylock方法判断是否拿到锁
5.synchronized能锁代码块,能锁方法。lock只能锁代码块
6.lock看可以使用读写锁提高读的效率ReenatrantReadWriteLock
7。synchronized是非公平锁,lock能公平也能不公平
下面有人要问了什么是公平锁啊?
能保证每个线程都能拿到锁的就是公平锁,相对而言就是非公平锁,非公平锁一般效率比较高,但是可能会导致线程饿死。
计算机结构
计算机由5部分组成:输入设备,存储器,运算器,控制器,输出设备。
运算器和控制器组成了cpu,cpu进行交互要先跟内存进行交互,cpu的速度是内存运行速度的上百倍,为了解决速度不平衡问题,cpu采取了缓存的措施。cpu分为三级缓存,L1,L2,L3 cpu拿数据,会先去缓存L1中拿,没有命中再去L2,L3最后没有再去找内存要。
Java内存模型JMM
JMM主要分两个部分,主内存和工作内存。
线程在工作时会有一个工作内存,而主内存是共享变量,线程写数据,会把数据拷贝到工作内存,处理完后再同步回主内存。
Java锁
4种状态锁
无状态锁,偏向锁状态,轻量级锁,重量级锁
1.偏向锁:线程拿到锁后,回在对象头和栈帧种存储线程ID,下次进来就不用进行CAS枷锁了,偏向锁只有等到其他竞争出现才释放锁。先暂停偏向锁的线程,将对象头设为无锁状态,最后唤醒线程。
2.轻量级锁
加锁:JVM在栈帧中创建锁记录,把对象头的MarkWork复制并指向锁记录指针,如果失败则自选。
解锁:将Displaced MarkWork换回对象头,没有竞争就释放成功,如果由线程一直自选获取锁,锁就会膨胀,变成重量级锁,然后释放,唤醒其他线程。
3.重量级锁
线程阻塞,响应时间长
多个处理器处理数据怎么保证原子性
总线锁:就是一个处理器获取锁,其他处理器阻塞,该处理器独占共享内存,开销太大
缓存锁:使用缓存一致性保证原子性,锁住当前缓存行,不能跨多行
CAS比较并交换
A预期值 V内存地址 B新值
当V==A时,证明没有被修改过,就把B赋值给A,不然就循环CAS
CAS的三个问题
1ABA问题,A修改成B又被修改成A,这个时候回被认为没有修改过
2循环CAS开销比较大
3只能保证一i个共享变量原子操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值