Java多线程编程核心技术(第3版)
上QQ阅读APP看书,第一时间看更新

2.2.16 同步synchronized(class)代码块可以对类的所有对象实例起作用

同步synchronized(class)代码块的作用其实和synchronized静态方法的作用一样。创建测试项目synBlockMoreObjectOneLock,类文件Service.java代码如下:


package service;

public class Service {

public void printA() {
    synchronized (Service.class) {
        try {
            System.out.println("线程名称为:" + Thread.currentThread().getName()
                + "在" + System.currentTimeMillis() + "进入printA");
            Thread.sleep(3000);
            System.out.println("线程名称为:" + Thread.currentThread().getName()
                + "在" + System.currentTimeMillis() + "离开printA");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

public void printB() {
    synchronized (Service.class) {
        System.out.println("线程名称为:" + Thread.currentThread().getName()
            + "在" + System.currentTimeMillis() + "进入printB");
        System.out.println("线程名称为:" + Thread.currentThread().getName()
            + "在" + System.currentTimeMillis() + "离开printB");
    }
}
}

两个自定义线程代码如图2-46所示。

图2-46 两个自定义线程代码

运行类Run.java代码如下:


package test;

import service.Service;
import extthread.ThreadA;
import extthread.ThreadB;

public class Run {

public static void main(String[] args) {

    Service service1 = new Service();
    Service service2 = new Service();

    ThreadA a = new ThreadA(service1);
    a.setName("A");
    a.start();

    ThreadB b = new ThreadB(service2);
    b.setName("B");
    b.start();

}

}

程序运行结果如图2-47所示。

图2-47 同步运行