【www.gdgbn.com--js教程】

这是应为在方法级别的synchronized声明将lock这个类对象的当前实例。所以在synMethord1运行结束unlock之前,当前Java SynDemo对象实例是无法运行synMethord2的。这种方法级别的synchronized声明和以下的做法是等同的:

  1.package com.cnblogs.gpcuster;/** * * @author Aaron.Guo * */

  2.public class SynDemo { public void synMethord1() {

  synchronized (this) { while (true) { try { Thread.sleep(1000);

  System.out.println("synMethord1"); } catch (InterruptedException

  e) { // TODO Auto-generated catch block

  3.e.printStackTrace();

  4.}

  5.}

  6.}

  7.}

  8.public void synMethord2() { synchronized (this) { while (true)

  { try { Thread.sleep(1000); System.out.println("synMethord2"); }

  catch (InterruptedException e) { // TODO Auto-generated catch block

  9.e.printStackTrace();

  10.}

  11.}

  12.}

  13.}

  14.}

  运行程序,结果与上次相同。

  如果我们希望分别同步2个方法该如何处理?可以参考这个实现:

  15.package com.cnblogs.gpcuster;/** * * @author Aaron.Guo * */

  16.public class SynDemo { private Object flag1 = new Object();

  private Object flag2 = new Object(); public void synMethord1()

  { synchronized (flag1) { while (true) { try { Thread.sleep(1000);

  System.out.println("synMethord1"); } catch (Interrupted

  Exception e) { // TODO Auto-generated catch block

  17.e.printStackTrace();

  18.}

  19.}

  20.}

  21.}

  22.public void synMethord2() { synchronized (flag2) { while (true)

  { try { Thread.sleep(1000); System.out.println("synMethord2"); }

  catch (InterruptedException e) { // TODO Auto-generated catch block

  23.e.printStackTrace();

  24.}

  25.}

  26.}

  27.}

  28.}

  运行程序,结果如我们预期:

  29.main

  30.synMethord2

  31.synMethord2

  32.main

  33.synMethord1

  34.main

  35.synMethord1

  36.synMethord2

本文来源:http://www.gdgbn.com/wangyezhizuo/24929/