繁体   English   中英

类的静态方法之间的同步

[英]Synchronization between static methods of a class

我编写了以下代码:

public class ClassAndObjectLock {
 public static void main(String[] args) {
  new Thread(new EvenThread()).start();
  new Thread(new OddThread()).start();
 }
}

class EvenThread implements Runnable {
 public void run() {
  for (int i = 0; i < 10; i += 2) {
   CommonClass.printEvenNumber(i);
  }
 }
}

class OddThread implements Runnable {
 public void run() {
  for (int i = 1; i < 10; i += 2) {
   CommonClass.printOddNumber(i);
  }
 }
}

class CommonClass {
 public static void printEvenNumber(int num) {
  synchronized (CommonClass.class) {
   System.out.println("Even :" + num);
  }
 }

 public static void printOddNumber(int num) {
  synchronized (CommonClass.class) {
   System.out.println("Odd :" + num);
  }
 }
}

当我执行以上代码时,输​​出如下:

Even :0
Odd :1
Even :2
Odd :3
Even :4
Odd :5
Even :6
Odd :7
Even :8
Odd :9

我不明白这个输出。 根据我的理解,当new Thread(new EvenThread()).start(); 被执行时,它产生类的线程EvenThread其应获得的锁CommonClass并保持锁定自身,直到它已打印所有偶数值。 的目的OddThread应该得到的对象后才有机会EvenThread已经完成。 因此,我认为输出应为以下内容:

Even :0  
Even :2
Even :4
Even :6
Even :8
Odd :1
Odd :3
Odd :5
Odd :7
Odd :9

谁能解释我的基本逻辑吗?

根据我的理解,当new Thread(new EvenThread())。start(); 在执行完之后,它会产生一个EvenevenThread类的线程,该线程应该获取CommonClass的锁,并将该锁保留在其自身上,直到打印出所有偶数值为止。

不,不是这样的:

 public static void printOddNumber(int num) {
   synchronized (CommonClass.class) {
       System.out.println("Odd :" + num);
   }
 }

(由于该方法在监视器类上是静态的),也可以写成

 public static synchronized void printOddNumber(int num) {
       System.out.println("Odd :" + num);
 }

查看同步块的范围:它输出一个数字,然后释放锁。

如果要打印所有数字而不会被打断,则必须在整个for循环期间锁定:

public void run() {
  synchronized(CommonClass.class){
    for (int i = 0; i < 10; i += 2) {
     System.out.println("Even :" + num);
    }
  }
}

您的同步处于打印方法级别,这意味着每个打印都将获取并释放锁。 如果希望线程在持续时间内保持锁定,则必须在线程的run方法中(围绕循环)在该对象上进行同步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM