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

2.2.10 验证方法被调用是随机的

同步代码块放在非同步synchronized方法中进行声明,并不能保证调用方法的线程的执行同步/顺序性,即线程调用方法是无序的。下面就来验证多个线程调用同一个方法是随机的。

创建测试用的项目,项目名称为syn_Out_asyn,类MyList.java代码如下:


package mylist;

import java.util.ArrayList;
import java.util.List;

public class MyList {

private List list = new ArrayList();

synchronized public void add(String username) {
    System.out.println("ThreadName=" + Thread.currentThread().getName()
        + "执行了add方法!");
    list.add(username);
    System.out.println("ThreadName=" + Thread.currentThread().getName()
        + "退出了add方法!");
}

synchronized public int getSize() {
    System.out.println("ThreadName=" + Thread.currentThread().getName()
        + "执行了getSize方法!");
    int sizeValue = list.size();
    System.out.println("ThreadName=" + Thread.currentThread().getName()
        + "退出了getSize方法!");
    return sizeValue;
}

}

两个线程对象代码如图2-33所示。

图2-33 两个线程对象代码

类Test.java代码如下:


package test;

import mylist.MyList;
import extthread.MyThreadA;
import extthread.MyThreadB;

public class Test {

public static void main(String[] args) {
    MyList mylist = new MyList();

    MyThreadA a = new MyThreadA(mylist);
    a.setName("A");
    a.start();

    MyThreadB b = new MyThreadB(mylist);
    b.setName("B");
    b.start();
}

}

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

图2-34 运行结果

从运行结果来看,同步方法中的代码是同步输出的,所以线程的“执行”与“退出”是成对出现的,但方法被调用是随机的,也就是线程A和线程B的执行是异步的。