目标
理解synchronized的含义、明确synchronized关键字修饰普通方法、静态方法和代码块时锁对象的差异。
作业
问题1:
有如下一个类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();
请问二者能否构成线程同步?
问题2:如果A的定义是下面这种呢?
class A {
public static synchronized void a() {
}
public static synchronized void b() {
}
}
synchronized关键字的含义
synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
synchronized的三种应用方式
1. 修饰普通方法
锁的是当前类的实例对象;多线程中不同对象访问此方法,无法保证同步。
线程A、B访问object的方法(包含同步和异步方法),假设A持有了object对象的Lock锁,B线程如果在这时调用object对象中的synchronized类型的方法则需要等待,也就是同步,但是B此时可以异步访问object的非synchronized方法。
2. 修饰静态方法
锁的是当前类,synchronized加到static静态方法上是给Class类上锁;多线程中不同对象访问此方法,可以保证同步。
3. 修饰代码块
如Synchronized(obj) 这里的obj 可以为类中的一个属性、也可以是当前的对象,它的同步效果和修饰普通方法一样;Synchronized方法 (obj.class)静态代码块它的同步效果和修饰静态方法类似。
当一个线程访问object的一个synchronized同步代码块时,另一个线程仍然可以访问该object对象中的非synchronized(this)同步代码块。
synchronized其他知识点
- 自己可以再次获取自己的内部锁。
- 当一个线程执行的的代码出现异常时,其所持有的锁会自动释放。
- 同步不具有继承性,所以还得在子类的方法中添加synchronized关键字。
总结
- 问题1:不能同步,多线程锁的是不同对象。
- 问题2:同步,多线程锁的是当前类,是同一把锁(A.class)。
网友评论