synchronized-对象锁和类锁
对象锁 synchronized(Xx)
并发安全问题
- 并发安全问题是指多个线程同时更新同一个内存地址的数据,即多个线程同时更新同一个对象。
为了避免出现数据错乱,需要让多个线程串行化 依次修改数据,通过对象锁实现串行化 - 多个线程更新多个不同地址的数据,即多个线程更新多个对象
因为多个地址相互隔离 互不影响,相当于每个地址只有一个线程,不会出现数据错乱
竞争同一对象锁
- 使用对象锁修饰代码块或方法时,想要执行代码逻辑必须先获取对象的锁
- 每个对象都有一个锁,某个线程获取到锁后执行代码逻辑 其它线程等待,当此线程执行完成释放锁 其它线程再次竞争此对象的锁
对象锁类型
修饰非静态方法,即成员方法
- 相当于synchronized(this),竞争当前对象的对象锁
public synchronized void objectLock1(){}
方法内代码块-修饰成员变量
- 竞争成员变量对象的对象锁
private XX xx;
public void objectLock3(){
synchronized(xx){
//...省略...
}
}
类锁 synchronized(Xx.class)
- 类锁是一种特殊的对象锁,竞争的是相应Class对象的锁
每个类只有一个Class对象
一个类可能会存在多个实例对象,但是有且只有一个Class对象
所以类锁粒度比对象锁更大
类锁类型
修饰静态方法
- 相当于synchronized(当前类.class),竞争当前类Class对象锁
public synchronized static void classLock1() {}
方法内代码块-修饰类
- 竞争Xx类Class对象锁
public static void classLock3() {
synchronized(_11_SynchronizedClass.class) {
//...省略...
}
}