理解:Java中的synchronized关键字.
指标:理解synchronized的含义、明确synchronized关键字修饰普通方法、 静态方法和代码块时锁对象的差异.
有如下一个类A
class A{ public synchronized void a(){} public synchronized void b(){} }
两个对象
A a1 = new A();
A a2 = new A();Thread1 Thread2
a1.a(); a2.a();请问二者能否构成线程同步?
如果A的定义是这样的呢?
class A{ public static synchronized void a(){} public static synchronized void b(){} }
synchronized 修饰对象为以下3种:
- 修饰普通方法,一个对象中加锁的方法只允许是一个线程访问的.这种情况锁的是访问该方法的实例对象,如果是多个线程不同的对象访问该方法,则无法保证同步.
- 修饰静态方法,静态方法是类方法,所以这种情况下锁的是包含这个方法的类,也就是类对象,这种情况下,多个线程的不同对象也是可以保证同步的
- 修饰代码块,如果是synchronized (obj),这个同步效果等同于修饰普通方法, 如果是synchronized (obj.class)同步效果等同于修饰静态方法.
问题1:不能同步
问题2:能同步