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

2.2.7 验证synchronized(this)同步代码块是锁定当前对象的

和synchronized方法一样,synchronized(this)同步代码块也是锁定当前对象的。

创建t8项目,文件Task.java代码如下:


package mytask;

public class Task {

public void otherMethod() {
System.out.println("------------------------run--otherMethod");
}

public void doLongTimeTask() {
    synchronized (this) {
        for (int i = 0; i < 10000; i++) {
            System.out.println("synchronized threadName="
                + Thread.currentThread().getName() + " i=" + (i + 1));
        }
    }

}
}

文件MyThread1.java代码如下:


package mythread;

import mytask.Task;

public class MyThread1 extends Thread {

private Task task;

public MyThread1(Task task) {
    super();
    this.task = task;
}

@Override
public void run() {
    super.run();
    task.doLongTimeTask();
}

}

文件MyThread2.java代码如下:


package mythread;

import mytask.Task;

public class MyThread2 extends Thread {

private Task task;

public MyThread2(Task task) {
    super();
    this.task = task;
}

@Override
public void run() {
    super.run();
    task.otherMethod();
}

}

文件Run.java代码如下:


package test;

import mytask.Task;
import mythread.MyThread1;
import mythread.MyThread2;

public class Run {

public static void main(String[] args) throws InterruptedException {
    Task task = new Task();

    MyThread1 thread1 = new MyThread1(task);
    thread1.start();

    Thread.sleep(100);

    MyThread2 thread2 = new MyThread2(task);
    thread2.start();
}
}

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

图2-27 异步输出

更改Task.java代码如下:


package mytask;

public class Task {

synchronized public void otherMethod() {
System.out.println("------------------------run--otherMethod");
}

public void doLongTimeTask() {
    synchronized (this) {
        for (int i = 0; i < 10000; i++) {
            System.out.println("synchronized threadName="
                + Thread.currentThread().getName() + " i=" + (i + 1));
        }
    }

}
}

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

图2-28 同步输出

同步输出的原因是使用synchronized (this)同步代码块将当前类的对象作为锁,使用synchronized public void otherMethod()同步方法将当前方法所在类的对象作为锁,两者是一把锁,所以运行结果呈同步的效果。