Java SynDemo对象刚一出现的时候有很多程序员都很头痛,其实这是完全没有必要的,下面我们就来详细的学习下有关的相关问题。我们发现,对于Java SynDemo对象,只有synMethord1运行了,而synMethord2却没有运行。
这是应为在方法级别的synchronized声明将lock这个类对象的当前实例。所以在synMethord1运行结束unlock之前,当前Java SynDemo对象实例是无法运行synMethord2的。这种方法级别的synchronized声明和以下的做法是等同的:
- package com.cnblogs.gpcuster;/** * * @author Aaron.Guo * */
- 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- e.printStackTrace();
- }
- }
- }
- }
- public void synMethord2() { synchronized (this) { while (true)
{ try { Thread.sleep(1000); System.out.println("synMethord2"); }
catch (InterruptedException e) { // TODO Auto-generated catch block- e.printStackTrace();
- }
- }
- }
- }
- }
运行程序,结果与上次相同。
如果我们希望分别同步2个方法该如何处理?可以参考这个实现:
- package com.cnblogs.gpcuster;/** * * @author Aaron.Guo * */
- 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- e.printStackTrace();
- }
- }
- }
- }
- public void synMethord2() { synchronized (flag2) { while (true)
{ try { Thread.sleep(1000); System.out.println("synMethord2"); }
catch (InterruptedException e) { // TODO Auto-generated catch block- e.printStackTrace();
- }
- }
- }
- }
- }
运行程序,结果如我们预期:
- main
- synMethord2
- synMethord2
- main
- synMethord1
- main
- synMethord1
- synMethord2
关于Synchronized还有一些其他的话题,如static的问题,继承的问题,与volatile搭配使用等等,在网上都有很详细的说明,这里就不重复介绍了。 以上就是对Java SynDemo对象的详细介绍。
【编辑推荐】