synchronized又叫暗锁,同步锁,用于保证线程共享资源的安全。
synchronized用法
1,用于实例方法中
这个时候需要使用一个对象。如果new了多个对象,那么无法实现同步。
其他对象不能获取被synchronized锁定的方法。但是可以获得其他未被锁定的方法
2,用于同步块中
需要创建一个对象锁,
一个线程持有此处对象锁时,其他线程不可以获得,进入阻塞状态。
相比较于实例方法,提高了性能
3,用于静态方法
当synchronized作用于静态方法时,其锁就是当前类的class对象锁。
注意:当线程a调用一个实例中被synchronized修饰的静态方法时
,线程b想要调用这个实例中被synchronized修饰的实例方法是可以的。
这个实例方法是占用的是当前的实例对象锁。不冲突。
但是加锁的时候还是会冲突
synchronized具有可重入性
即一个锁在使用时可以再次进入调用其他方法。
sleep
sleep方法暂停当前线程后,会进入阻塞状态,
只有当睡眠时间到了,才会转入就绪状态。
而yield方法调用后 ,是直接进入就绪状态,
所以有可能刚进入就绪状态,又被调度到运行状态。
wait
线程会被暂停,锁会被释放,知道有线程调用notify或者notifyall的时候才会继续执行。notify和notifyall也不会立刻释放,等到synchronized锁里的运行完才会释放。
yield