代码如下:
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