过程:
1.写一个类MyObjcet,里面有两个方法,methodA和methodB。
2.synchronized声明methodA类是同步的,B类不声明。
3.写两个线程类 ThreadA和TheadB,分别调用methodA和methodB
4.写主函数,运行代码,注意:两个线程要访问同一个对象,否则相当于异步执行。
5.检查结果,然后把B类也声明,再次运行,检查结果。
代码:
MyObjcet.java(这里直接加同步了)
package synchronizedMethodLockObject;
public class MyObject {
synchronized public void methodA(){
try {
System.out.println("begin methodA threadName=" + Thread.currentThread().getName());
Thread.sleep(5000);
System.out.println("end endTimeA" + System.currentTimeMillis());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
synchronized public void methodB(){
try {
System.out.println("begin methodB threadName=" + Thread.currentThread().getName());
Thread.sleep(5000);
System.out.println("end endTimeB" + System.currentTimeMillis());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ThreadA.java
package synchronizedMethodLockObject;
public class ThreadA extends Thread{
private MyObject object;
ThreadA(MyObject object){
this.object = object;
}
@Override
public void run(){
object.methodA();
}
}
ThreadB.java
package synchronizedMethodLockObject;
public class ThreadB extends Thread{
private MyObject object;
ThreadB(MyObject object){
this.object = object;
}
@Override
public void run(){
object.methodB();
}
}
package synchronizedMethodLockObject;
public class Run {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyObject object = new MyObject();
ThreadA a = new ThreadA(object);
a.setName("A");
ThreadB b = new ThreadB(object);
b.setName("B");
a.start();
b.start();
}
}
结果对比:
不声明methodB:
begin methodB threadName=B
begin methodA threadName=A
end endTimeA1513150686375
end endTimeB1513150686376
声明methodB:
begin methodA threadName=A
end endTimeA1513150719053
begin methodB threadName=B
end endTimeB1513150724054