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

2.2.3 用同步代码块解决同步方法的弊端

创建t6项目,将t5项目中的所有文件复制到t6项目中,并更改文件Task.java代码如下:


package mytask;

public class Task {

private String getData1;
private String getData2;

public void doLongTimeTask() {
    try {
        System.out.println("begin task");
        Thread.sleep(3000);

        String privateGetData1 = "长时间处理任务后从远程返回的值1 threadName=" + 
            Thread.currentThread().getName();
        String privateGetData2 = "长时间处理任务后从远程返回的值2 threadName=" + 
            Thread.currentThread().getName();

        synchronized (this) {
            getData1 = privateGetData1;
            getData2 = privateGetData2;
            System.out.println(getData1);
            System.out.println(getData2);
            System.out.println("end task");
        }

    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

}

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

图2-22 运行速度很快

通过上面的示例可以得出,当一个线程访问object对象的一个synchronized同步代码块时,另一个线程仍然可以访问该对象中的非synchronized(this)同步代码块。

通过示例,时间虽然缩短,加快了运行效率,但同步synchronized(this)代码块真的是同步的吗?它真的持有当前调用对象的锁吗?是的,但必须用代码的方式来进行验证。