java基础——synchronize

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缓存-内存


本文是笔者的学习笔记,分享出来,难免有不合理的地方

欢迎大神指出错误 ~笔者会迅速更正。引用请注明出处,谢谢

你可能感兴趣的:(java基础——synchronize)