代码如下:
package com.dada.test.thread;
public class Common {
private static Object o= new Object();
public void synchronizedMethod1() {
synchronized(o){
System.out.println(Thread.currentThread().getName()+ " synchronizedMethod1 called");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+ " synchronizedMethod1 done");
}
}
public void method1() {
System.out.println(Thread.currentThread().getName()+ " Method 1 called");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" Method 1 done");
}
}
package com.dada.test.thread;
public class MyThread extends Thread {
private int id = 0;
private Common common;
public MyThread(String name, int no, Common object) {
super(name);
common = object;
id = no;
}
public void run() {
System.out.println("Running Thread" + this.getName());
try {
if (id == 0) {
common.synchronizedMethod1();
} else {
common.method1();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception{
Common c1 = new Common();
Common c2 = new Common();
MyThread t1 = new MyThread("MyThread-1", 0, c1);
MyThread t2 = new MyThread("MyThread-2", 0, c2);
t1.start();
t2.start();
}
}
测试了几种情况
1.锁为对象的static成员
private static Object o= new Object();
public static void main(String[] args) throws Exception{
Common c1 = new Common();
Common c2 = new Common();
MyThread t1 = new MyThread("MyThread-1", 0, c1);
MyThread t2 = new MyThread("MyThread-2", 0, c2);
t1.start();
t2.start();
}
输出结果:
Running ThreadMyThread-1
Running ThreadMyThread-2
MyThread-1 synchronizedMethod1 called
MyThread-1 synchronizedMethod1 done
MyThread-2 synchronizedMethod1 called
MyThread-2 synchronizedMethod1 done
即对该类的所有实例对象都生效
2.
private Object o= new Object();
public static void main(String[] args) throws Exception{
Common c1 = new Common();
Common c2 = new Common();
MyThread t1 = new MyThread("MyThread-1", 0, c1);
MyThread t2 = new MyThread("MyThread-2", 0, c2);
t1.start();
t2.start();
}
输出结果:
Running ThreadMyThread-1
Running ThreadMyThread-2
MyThread-1 synchronizedMethod1 called
MyThread-2 synchronizedMethod1 called
MyThread-2 synchronizedMethod1 done
MyThread-1 synchronizedMethod1 done
3.
private Object o= new Object();
public static void main(String[] args) throws Exception{
Common c1 = new Common();
Common c2 = new Common();
MyThread t1 = new MyThread("MyThread-1", 0, c1);
MyThread t2 = new MyThread("MyThread-2", 0, c1);
t1.start();
t2.start();
}
输出结果
Running ThreadMyThread-1
Running ThreadMyThread-2
MyThread-1 synchronizedMethod1 called
MyThread-1 synchronizedMethod1 done
MyThread-2 synchronizedMethod1 called
MyThread-2 synchronizedMethod1 done