理解Java中的synchronized关键字。
synchronized 是java中的一个关键字,用于多线程情况下解决线程同步问题;它可以用来修饰代码块,方法,还有静态方法
- 1) 修饰一个代码块:被修饰的代码块叫作同步代码块,作用范围是{}括起来的代码,作用对象是根据锁对象判断.例如:1.synchronized(this){}这样它的作用对象是调用该方法的对象2. synchronized(Object.class){} 这样它的作用对象是这个类的所有对象
- 2) 修饰一个方法:被修饰的方法叫作同步方法,作用范围是被修饰的整个方法,作用对象是调用该方法的对象
- 3) 修饰一个静态方法:作用范围是被修饰的整个静态方法,作用对象是这个类的所有对象
做几个例题:
有如下一个类Aclass A {
public synchronized void a() {
}
public synchronized void b() {
}
}
然后创建两个对象
A a1 = new A();
A a2 = new A();
然后在两个线程中并发访问如下代码:
Thread1 Thread2
a1.a(); a2.a();
请问二者能否构成线程同步?
这种情况是不构成同步的,上面有说到synchronized修饰的方法的作用范围是调用该方法的对象,这里显然是两个对象他们会调用各自的同步方法,不能同步
如果A的定义是下面这种呢?class A {
public static synchronized void a() {
}
public static synchronized void b() {
}
}
- 这种情况就构成了同步,因为synchronized修饰的静态方法的作用范围是该类的所有对象