1.理解sysnchronized的含义,明确synchronized关键字修饰普通方法,静态方法和代码块时锁对象的差异
如下有个类
class A{
public synchronize void a(){
}
public synchronize void b(){
}
}
然后创建两个对象
A a1 = new A();
A a2 = new A();
然后在两个线程中并发访问如下代码:
Thread1 Thread2
a1.a(); a2.a();
能否构成线程同步?
情况二:
class A{
public static synchronize void a(){
}
public static synchronize void b(){
}
}
此时在多线程中能否同步?
关于synchronized使用的场景:
1.synchronized修饰普通方法public synchronized void memberMethod(){};
调用普通类的方法,需要创建该类的实列对象来调用,那么当我们调用synchronized方法时,此时用到的锁就是对象锁。也就是该类的实列对象.
所以在不同的线程中,使用不同的对象实列,不能构成同步
2.synchronized修饰静态方法pulbic static synchronized void memberMethod(){};
调用静态方法只需要使用类名加方法就可以,当调用静态的synchronized方法时,此时用到的锁就是该方法类的对象。用的是类锁,
所以能构成同步,
3.synchronized代码块,使用代码有3种情况
I . synchronized(对象){}
II . synchronized(类名.class){}
III. synchronized(this){}
如果使用this的话,此时用的锁是该代码块所在方法的实列对象,相当于对象锁一样,所以不能构成同步,因为多个对象,多个实列
如果使用类名.class 此时用的锁是类锁,可以构成同步
如果使用的是对象,此时用的锁是对象锁,只需要保持这个对象锁是唯一,多个实列中都用的是同一个对象锁,此时就可以构成同步