锁:方法锁、对象锁、类锁
1.方法锁(synchronized修饰方法时):synchronized放在方法和在方法内synchronize(this)是等价的。都仅仅能锁住当前对象。
2.对象锁(synchronized修饰方法或代码块)
调用此对象的同步方法或进入同步代码区域,需要先获得对象锁;若对象锁被占用需等待锁释放;java对象都有一个对象锁,由jvm自动获取和释放;synchronized方法正常返回或者抛异常而终止,jvm会自动释放对象锁。
3.由于一个class不论被实例化多少次,其中的静态方法和静态变量在内存中都只有一份。所以,一旦一个静态的方法被声明为synchronized。此类所有的实例对象在调用此方法,共用同一把锁,我们称之为类锁。
***不是同一个对象,则不会产生相互排斥
对象锁是用来控制实例方法之间的同步,而类锁是用来控制静态方法(或者静态变量互斥体)之间的同步的。
同步和异步
同步:顺序执行,调用方法等待系统返回结果,出于阻塞状态;
异步:不用阻塞等待;委托异步任务单独完成。