理解: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:能同步