非静态方法的锁为this,静态方法锁为Class实例
1、新建Java类演示两个普通同步方法,两个线程打印的顺序。Number非静态方法的锁默认为this,同一个时刻拥有的是同一把锁,打印为one,twopackage com.gwolf;public class TestThread8Monitor { public static void main(String[] args) { Number number = new Number(); new Thread(new Runnable() { @Override public void run() { number.getOne(); } }).start(); new Thread(new Runnable() { @Override public void run() { number.getTwo(); } }).start(); }}class Number { public synchronized void getOne() { System.out.println("one"); } public synchronized void getTwo() { System.out.println("tow"); }}

3、现在新增Thread.sleep()给getOne(),Number非静态方法的锁默认为this,同一个时刻拥有的是同一把锁,尽管getOne()方法休眠了三秒,打印还是为one荑樊综鲶,twopackage com.gwolf;public class TestThread8Monitor { public static void main(String[] args) { Number number = new Number(); new Thread(new Runnable() { @Override public void run() { number.getOne(); } }).start(); new Thread(new Runnable() { @Override public void run() { number.getTwo(); } }).start(); }}class Number { public synchronized void getOne() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("one"); } public synchronized void getTwo() { System.out.println("tow"); }}

5、查看程序执行结果:three,tow,one。Number非静态方法的锁默认为this,同一个时刻拥有的是同一把锁,首先打印另外一个对象的three,然后打印为one,two
