[英]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.