急1.import java.util.*; 2.3.public class NameList { 4.private List names = new ArrayList(); 5.public synchronized void add(String name) { names.add(name); } 6.public synchronized void printAll() { 7.for (int i = 0; i

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/01 11:44:03

急1.import java.util.*; 2.3.public class NameList { 4.private List names = new ArrayList(); 5.public synchronized void add(String name) { names.add(name); } 6.public synchronized void printAll() { 7.for (int i = 0; i

1.import java.util.*;
2.
3.public class NameList {
4.private List names = new ArrayList();
5.public synchronized void add(String name) { names.add(name); }
6.public synchronized void printAll() {
7.for (int i = 0; i

急1.import java.util.*; 2.3.public class NameList { 4.private List names = new ArrayList(); 5.public synchronized void add(String name) { names.add(name); } 6.public synchronized void printAll() { 7.for (int i = 0; i
试着回答一下:
这道题主要考线程和同步方法的知识点.
由于add()和print()两个方法被加上了关键字synchronized,通俗点理解就是说:当其中一个线程在访问add()方法的时候,另一个线程必须等待到前一个线程退出add()的访问后才能访问add()方法,print()方法同理.
这里循环2次,第一次循环启动线程1,线程1在添加A,B,C的值之后,开始访问print(),也就是退出了add()方法,其他线程可以访问add(),那么在线程1访问完print()的时候,线程2即启动,由于线程存在不确定性,E的选项是大多数出现的情况,但偶尔也会出现G选项,是因为,即便线程1访问完print(),不代表print()会在线程2启动之前就执行完毕了.这里假设print()按顺序打印容器里由线程1存入容器的ABC过程中,线程2得到过一次机会上了CPU一次,那么线程2就可能存入新的ABC进入容器,可能线程2就恰好存入了A,还未存入BC的时候就被时间轴轮换下CPU,而此刻线程1的print()也许刚好执行到打印C,但是此刻实际上容器里的元素已经变成了ABCA,所以线程1就可能执行print()方法打出ABCA,之后,就轮到线程2正常打印ABCABC,所以有了答案是ABCAABCABC的G选项.而按照上面的推理,也许还可能出现ABCABABCABC的情况,不过这样的几率已经非常小了.
不知道我的解释你是否能看明白!