上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的执行是异步的。