1)当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程则无法该object的另外一个synchronized(this)同步代码块。
public class Thread1 { public void m4t1() { synchronized (this) { int i = 5; while (i-- > 0) { System.out .println(Thread.currentThread().getName() + " : " + i); try { Thread.sleep(1000); } catch (InterruptedException ie) { } } } } public void m4t2() { synchronized (this) { int i = 5; while (i-- > 0) { System.out .println(Thread.currentThread().getName() + " : " + i); try { Thread.sleep(500); } catch (InterruptedException ie) { } } } } public static void main(String[] args) { final Thread1 myt2 = new Thread1(); Thread t1 = new Thread(new Runnable() { public void run() { myt2.m4t1(); } }, "t1"); Thread t2 = new Thread(new Runnable() { public void run() { myt2.m4t2(); } }, "t2"); t1.start(); t2.start(); } }
2)当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
public class Thread2 { public void m4t1() { synchronized (this) { int i = 5; while (i-- > 0) { System.out .println(Thread.currentThread().getName() + " : " + i); try { Thread.sleep(1000); } catch (InterruptedException ie) { } } } } public void m4t2() { int i = 5; while (i-- > 0) { System.out.println(Thread.currentThread().getName() + " : " + i); try { Thread.sleep(500); } catch (InterruptedException ie) { } } } public static void main(String[] args) { final Thread2 myt2 = new Thread2(); Thread t1 = new Thread(new Runnable() { public void run() { myt2.m4t1(); } }, "t1"); Thread t2 = new Thread(new Runnable() { public void run() { myt2.m4t2(); } }, "t2"); t1.start(); t2.start(); } }
3)以上规则对其它对象锁同样适用:尽管线程t1获得了对Inner的对象锁,但由于线程t2访问的是同一个Inner中的非同步部分。所以两个线程互不干扰。
public class Thread3 { class Inner { private void m4t1() { int i = 5; while (i-- > 0) { System.out.println(Thread.currentThread().getName() + " : Inner.m4t1()=" + i); try { Thread.sleep(500); } catch (InterruptedException ie) { } } } private void m4t2() { int i = 5; while (i-- > 0) { System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i); try { Thread.sleep(500); } catch (InterruptedException ie) { } } } } private void m4t1(Inner inner) { synchronized (inner) { // 使用对象锁 inner.m4t1(); } } private void m4t2(Inner inner) { inner.m4t2(); } public static void main(String[] args) { final Thread3 myt3 = new Thread3(); final Inner inner = myt3.new Inner(); Thread t1 = new Thread(new Runnable() { public void run() { myt3.m4t1(inner); } }, "t1"); Thread t2 = new Thread(new Runnable() { public void run() { myt3.m4t2(inner); } }, "t2"); t1.start(); t2.start(); } }