众所周知,该列表不是线程安全的,我在下面所示的两个方法中向代码添加了同步.
1.
public class TestSyn
{
public static void main( String[] args ) throws InterruptedException
{
List<String> list = new ArrayList<>();
for( int i = 0; i < 100000; i++ )
{
new Thread(
()->
{
synchronized( list )
{
list.add( Thread.currentThread().getName() );
}
} ).start();
}
Thread.sleep( 2000 );
System.out.println( list.size() );
}
}
public class TestSyn2
{
public static void main( String[] args ) throws InterruptedException
{
List<String> list = new ArrayList<>();
synchronized( list )
{
for( int i = 0; i < 10000; i++ )
{
new Thread( () -> list.add( Thread.currentThread().getName() ) )
.start();
}
}
Thread.sleep( 2000 );
System.out.println( list.size() );
}
}
第一种方法的结果总是正确的10000,而第二种方法有时不到10000.
那么,为什么第二个不能输出正确的结果呢?