笔记
一个对象里面如果有多个synchronized方法,某一时刻内,只要一个线程去调用其中的一个synchronzed方法了,其他的线程都只能等待。
换句话说,某一时刻内,只能由为一个个线程去访问这些synchronized方法,锁的是当前this,被锁定后,其他的线程都不能进入到当前对象的其他的synchronized方法。
加个普通的方法后,发现和同步锁无关。
换成两个对象后,不是同一把锁了,情况立刻发生变化
都换成静态同步方法后,情况又变化
所有的非静态同步方法用的都是同一把锁,-----实例对象本身,
synchronized 实现同步的基础:java 中的每一个对象都可以作为锁
具体表现为以下 3 中形式:
对于静态同步方法,锁的是当前class 对象
当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。
也就是说,一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁
可是,别的实例对象的非静态同步方法 因为跟该实例对象的非静态同步方法用的是不同的锁,所以必须等待该实例对象已获取锁的非静态同步方法释放锁,就可以获取他们自己的锁。
所有静态同步方法用的也是同一把锁-----类对象本身
这两把锁是两个不同的对象,所以静态同步方法与非静态同步方法之间是不会有竞争条件的
但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才后,才能获取锁
而不管是同一个实例对象的静态同步方法之间,
还是不同的实例对象的静态同步方法之间,只要他们同一个类的实例对象。