![Java多线程编程核心技术(第3版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/745/42637745/b_42637745.jpg)
上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所示。
![](https://epubservercos.yuewen.com/204B22/22139293909121606/epubprivate/OEBPS/Images/2-33.jpg?sign=1739306108-HmCyUUDWV7W3XmgabnO1F693eOCXZhyB-0-0c7194b15e3055294b2e67ecc6216b00)
图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所示。
![](https://epubservercos.yuewen.com/204B22/22139293909121606/epubprivate/OEBPS/Images/2-34.jpg?sign=1739306108-i8yK6nPqq2DYSM9zieBoikR6qlCW6oMN-0-9ef8ad8de5323cedb1b6bc2e24066009)
图2-34 运行结果
从运行结果来看,同步方法中的代码是同步输出的,所以线程的“执行”与“退出”是成对出现的,但方法被调用是随机的,也就是线程A和线程B的执行是异步的。