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

2.2.2 synchronized同步代码块的使用

先来了解一下synchronized同步代码块的使用方法。

当两个并发线程访问同一个对象object中的synchronized(this)同步代码块时,一个时间内只能执行一个线程,另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

创建测试项目synchronizedOneThreadIn,类文件ObjectService.java代码如下:


package service;

public class ObjectService {

public void serviceMethod() {
    try {
        synchronized (this) {
            System.out.println("begin time=" + System.currentTimeMillis());
            Thread.sleep(2000);
            System.out.println("end    end=" + System.currentTimeMillis());
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
}

自定义线程ThreadA.java代码如下:


package extthread;

import service.ObjectService;

public class ThreadA extends Thread {

private ObjectService service;

public ThreadA(ObjectService service) {
    super();
    this.service = service;
}

@Override
public void run() {
    super.run();
    service.serviceMethod();
}

}

自定义线程ThreadB.java代码如下:


package extthread;

import service.ObjectService;

public class ThreadB extends Thread {
private ObjectService service;

public ThreadB(ObjectService service) {
    super();
    this.service = service;
}

@Override
public void run() {
    super.run();
    service.serviceMethod();
}
}

运行类Run.java代码如下:


package test.run;

import service.ObjectService;
import extthread.ThreadA;
import extthread.ThreadB;

public class Run {

public static void main(String[] args) {
    ObjectService service = new ObjectService();

    ThreadA a = new ThreadA(service);
    a.setName("a");
    a.start();

    ThreadB b = new ThreadB(service);
    b.setName("b");
    b.start();
}

}

图2-21 同步调用的结果

运行结果如图2-21所示。

上面的示例虽然使用了synchronized同步代码块,但执行的效率没有提高,还是同步运行。

如何用synchronized同步代码块解决程序执行效率慢的问题呢?