class ObjectService {
public void serviceMethodA(){
try{
synchronized (this){
System.out.println("A begin time = " + System.currentTimeMillis());
Thread.sleep(2000);
System.out.println("A end time = " + System.currentTimeMillis());
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
public void serviceMethodB(){
synchronized (this){
System.out.println("B begin time = " + System.currentTimeMillis() );
System.out.println("B end time = " + System.currentTimeMillis());
}
}
}
class ThreadA extends Thread {
private ObjectService service;
public ThreadA(ObjectService service){
this.service = service;
}
@Override
public void run() {
service.serviceMethodA();
}
}
class ThreadB extends Thread {
private ObjectService service;
public ThreadB(ObjectService service){
this.service = service;
}
@Override
public void run() {
service.serviceMethodB();
}
}
public class Run {
public static void main(String[] args) {
ObjectService service = new ObjectService();
ThreadA a = new ThreadA(service);
a.setName("a");
a.start();
ThreadB b = new ThreadB(service);
b.setName("b");
b.start();
}
}
结果:
A begin time = 1458139127424
A end time = 1458139129425
B begin time = 1458139129425
B end time = 1458139129425
即时线程B想调用MethodB,但是因为线程A获取了对象锁,线程B只能等待
- 对其他synchronized同步方法或synchronized(this)同步代码块调用呈阻塞状态
- 同一时间只有一个线程可以执行synchronized同步方法或同步代码块中的代码