此代码用于证明线程锁的是对象:
示例代码:
package a;
class MyObject{
public void methodA() {
try {
System.out.println("begin methodA threadName="+Thread.currentThread().getName());
Thread.sleep(5000);
System.out.println("end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Thread_OA extends Thread{
private MyObject object;
public Thread_OA(MyObject object) {
this.object=object;
}
@Override
public void run() {
this.object.methodA();
}
}
class Thread_OB extends Thread{
private MyObject object;
public Thread_OB(MyObject object) {
this.object=object;
}
@Override
public void run() {
this.object.methodA();
}
}
public class SynTest3 {
public static void main(String[] args) {
MyObject object=new MyObject();
Thread_OA oa=new Thread_OA(object);
oa.setName("A");
Thread_OB ob=new Thread_OB(object);
ob.setName("B");
oa.start();
ob.start();
}
}
在上面这段代码中没有对方法进行加锁。
输出结果:
begin methodA threadName=B
begin methodA threadName=A
end
end
结果分析:
可以看到一共有两个线程同时在执行 methodA方法。因为没有对象methodA添加synchronized关键字。
对象methodA方法添加synchronized
synchronized public void methodA() {
try {
System.out.println("begin methodA threadName="+Thread.currentThread().getName());
Thread.sleep(5000);
System.out.println("end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
修改后的代码如上
输出结果
begin methodA threadName=A
end
begin methodA threadName=B
end
结果分析
可以看到,此时两个线程没有同时进入methodA方法,也就是在线程A持有对象的lock锁的情况下,B线程如果想执行methodA方法则需要等待。