@Override
public void run() {
// TODO Auto-generated method stub
try {
im.comeInIn();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, "t2");
t1.start();
t2.start();
}
}
由以上代码可以看到: 在 comeInIn 方法中,运用 synchronized(this) 制造同步块,要执行同步块内的代码,就必须获得 this 对象的锁(调用 comeInIn 方法的对象)。
执行结果可能为:
由此执行结果可见:t1 线程先执行了 comeIn 方法,获得了对象 im 的锁,之后由于 t1 线程进入睡眠状态,t2 线程得到运行,开始执行 comeInIn 方法,当执行到同步代码块时发现对象 im 已被加锁,无法继续执行。t1 线程睡眠结束之后继续执行,结束后释放对象 im 的锁,t2 线程才能继续执行。
四、静态方法中使用 synchronized 关键字制造同步块
同步块中默认被加锁的对象是此同步块括号声明中包含的对象。
class staticMethodSynchronized {
private static final Object OBJ = new Object();
public static void method1() throws InterruptedException {
System.out.println(Thread.currentThread().getName() + ": start");
synchronized(OBJ) {
System.out.println(Thread.currentThread().getName() + ": 获得锁");
System.out.println(Thread.currentThread().getName() + ": 释放锁");
}
System.out.println(Thread.currentThread().getName() + ": finish");
}
public static void method2() throws InterruptedException {
System.out.println(Thread.currentThread().getName() + ": start");
synchronized(OBJ) {
System.out.println(Thread.currentThread().getName() + ": 获得锁");
System.out.println(Thread.currentThread().getName() + ": 释放锁");
}
System.out.println(Thread.currentThread().getName() + ": finish");
}
}
public class TestStaticClassSynchronized {
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
staticMethodSynchronized.method1();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, "t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
staticMethodSynchronized.method2();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, "t2");
t1.start();
t2.start();
}
}
在上述代码中,两个静态方法中的同步块都要获得对象 OBJ 的锁才能继续向下执行,执行结果可能如下:
若 t1 线程先获得锁,则必须等到 t1 释放锁之后,t2 线程中同步代码块及其之后的代码才能继续执行,t2 线程先获得锁,t1 线程同理。