java基础-并发synchronize
一、wait\notify\notify all\synchronized
对象锁:看门老大爷的角色
前言:每个obj都会涉及到的方法,因为和底层线程同步有关系,类似共享内存
1、synchronized
类似于操作系统的互斥内存块
功能:同步锁,类级别和方法实例。
方法:可以代码段中通过synchronized(obj)中obj参数的选择决定是类还是实例级别。也可 以在类定义中选择,static规定为类级别,成员方法规定为实例级别。
举例:人 张三 = new 人();同步方法:吃饭()
类级别就是,全人类只能有一个人在吃着饭。实例级别是,张三只能吃着一顿饭,但 是张三和李四王五都可以同时自己吃着一顿饭。
2、wait\notify
功能:wait是放弃锁并等待,notify是通知之前放弃锁等待的可以继续工作了
方法: synchronized(obj) {
while(!condition) {obj.wait();}
obj.doSomething();
}//当A获得obj锁以后,发现条件不满足就wait,放弃锁对象
synchronize(obj){
condition = true;
obj.notify();
}//condition满足后notify等待的线程A或其他wait的线程
举例:人 张三 = new 人();同步方法:1、吃饭2、送来改锥;锁:张三
张三吃着饭,发现没有改锥,于是记下等下再吃。张三吃着饭,发现没有改锥,于是又记下等下吃。张三吃着饭,李四送来了改锥,张三唤醒了某一顿没吃完的饭的记忆,继续吃没有吃完的饭。(问:张三吃饭为什么要用改锥!?)
3、notify all
举例:
锁:看门的张师傅(obj);同步方法:进大院,发现里面的宝藏(内存中的数据操作)
小李进大院,张师傅说:”施工呢,你排队等一下(wait)“,小李的故事线开始等待张师傅的唤醒。小王如此,小赵也如此。直到修好了,张师傅跟大家说:”你们可以进了(notify all )“
二、Lock、reentrantLock、自旋锁等其他锁的概念
自旋锁x(忙等待占用cpu)、阻塞锁(闲等待不占用cpu)、可重入锁(迭代和递归)、乐观锁(cas比较交换)线程先做着需要时更新、
4、Lock是锁对象的接口
对比synchronize,reentrantLock更适用于高并发,更多功能(中断和定时锁),更由代码控制(释放时靠finally)
5、volatile
更新3级缓存,不更新1、2级缓存,所以线程及时更新,读取的数据都是新的
cpu-寄存器-L1缓存-L2缓存-L3缓存-内存
本文是笔者的学习笔记,分享出来,难免有不合理的地方
欢迎大神指出错误 ~笔者会迅速更正。引用请注明出处,谢谢