同步列表仅同步该列表的方法。
这意味着当另一个线程当前正在运行该列表中的方法时,一个线程将无法修改列表。处理方法时对象被锁定。
举例来说,假设
addAll您的清单上有两个执行绪,并以2个不同的清单(
A=A1,A2,A3和
B=B1,B2,B3)作为参数。
随着方法的同步,您可以确保这些列表不会像
A1,B1,A2,A3,B2,B3
您无需确定线程何时将进程移交给另一个线程。每个方法调用必须完全运行并返回,然后另一个方法才能运行。因此,您可以获取
A1,A2,A3,B1,B2,B3
或B1,B2,B3,A1,A2,A3
(因为我们不知道哪个线程调用将首先运行)。
在您的第一段代码中,两个线程同时运行。两者都尝试将
add元素添加到列表中。除了
add方法上的同步之外,您没有任何方法可以阻塞一个线程,因此,没有什么可以阻止线程1
add在将进程移交给线程2之前运行多个操作。因此,您的输出是完全正常的。
在第二段代码(未注释的代码)中,您明确声明一个线程在开始循环之前已完全锁定了另一个线程的列表。因此,您确保一个线程在另一个线程可以访问该列表之前将运行完整循环。



