84 lines
2.2 KiB
Java
84 lines
2.2 KiB
Java
|
package thread_safe.safe4;
|
|||
|
|
|||
|
public class SynchronizedMethodLocakObject2 {
|
|||
|
|
|||
|
public static void main(String[] args) {
|
|||
|
MyObject myObject = new MyObject();
|
|||
|
|
|||
|
ThreadA threadA = new ThreadA(myObject);
|
|||
|
threadA.setName("ThreadA");
|
|||
|
|
|||
|
ThreadB threadB = new ThreadB(myObject);
|
|||
|
threadB.setName("ThreadB");
|
|||
|
|
|||
|
threadA.start();
|
|||
|
threadB.start();
|
|||
|
}
|
|||
|
|
|||
|
// 测试对象
|
|||
|
public static class MyObject {
|
|||
|
|
|||
|
/**
|
|||
|
* 测试方法A
|
|||
|
*/
|
|||
|
synchronized public void methodA() {
|
|||
|
try {
|
|||
|
System.out.println(Thread.currentThread().getName() + " 开始 " + System.currentTimeMillis());
|
|||
|
Thread.sleep(1000);
|
|||
|
System.out.println(Thread.currentThread().getName() + " 结束 " + System.currentTimeMillis());
|
|||
|
} catch (Exception exception) {
|
|||
|
exception.printStackTrace();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 测试方法B
|
|||
|
* 如果不加synchronized,整个程序是异步执行的
|
|||
|
* 如果加synchronized,整个程序是同步执行的
|
|||
|
*/
|
|||
|
synchronized public void methodB() {
|
|||
|
try {
|
|||
|
System.out.println(Thread.currentThread().getName() + " 开始 " + System.currentTimeMillis());
|
|||
|
Thread.sleep(1000);
|
|||
|
System.out.println(Thread.currentThread().getName() + " 结束 " + System.currentTimeMillis());
|
|||
|
} catch (Exception exception) {
|
|||
|
exception.printStackTrace();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 线程A
|
|||
|
public static class ThreadA extends Thread {
|
|||
|
|
|||
|
private final MyObject myObject;
|
|||
|
|
|||
|
public ThreadA(MyObject myObject) {
|
|||
|
super();
|
|||
|
this.myObject = myObject;
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public void run() {
|
|||
|
super.run();
|
|||
|
myObject.methodA();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 线程B
|
|||
|
public static class ThreadB extends Thread {
|
|||
|
|
|||
|
private final MyObject myObject;
|
|||
|
|
|||
|
public ThreadB(MyObject myObject) {
|
|||
|
super();
|
|||
|
this.myObject = myObject;
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public void run() {
|
|||
|
super.run();
|
|||
|
myObject.methodB();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|