想写个线程看看synchronized的功能:import java.util.ArrayList;
import java.util.List;public class ThreadSafeDemo
{
static List<Integer> list = new ArrayList<Integer>();
public static void main(String[] args)
{
ThreadSafeDemo tsd = new ThreadSafeDemo();
ThreadDemo td = tsd.new ThreadDemo();
td.start();

synchronized(list)
{
for(int i = 0 ; i < 10000000;i++)
{
list.add(i);
}
}
}

class ThreadDemo extends Thread
{
public void run()
{
synchronized(list)
{
System.out.println(list.size());
}
}
}
}线程启动后(td.start()),应该先走for循环,然后隔那么一小会线程的run()方法才会启动。
所以我的理解是:因为list放在synchronized块中,所以当list的循环做完了以后才会走run()方法
这样打印的就是整个循环完的长度。
现在是,当循环的值很大(如:10000000),它打印出来的值,总是固定值(我机器上是3308743)。
不知道这是为什么呢?
另:这个同步块放着,可以起到线程安全的作用吗?不懂!

解决方案 »

  1.   

    你的这个理解是正确的,
    在执行了td.start();后,
    确实要过一小段时间,才会执行run方法,
    这里加了同步能起到线程安全的作用,
    如果你把synchronized都去掉,
    为了明显期间,你在输出这个ArrayList的长度之前,
    执行下:try {
    Thread.sleep(10);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    然后你再加上synchronized再测试一下。
    加上synchronized的,会输出你想要的完整长度。至于为什么很大时输出的长度总是3308743,
    这个是不是ArrayList最多只能存这么多元素呢?
    我不清楚了,
    楼下继续!
      

  2.   

    这个段程序有两个问题.
    1)使用keyword synchronized没有错,但是ArrayList本身不是ThreadSafe的.
    需要通过List<Integer> list = Collections.synchronizedList(new ArrayList<Integer>());来创建List
    2)10000000太大了,会出现内存溢出的错误.
      

  3.   

    可以起到同步安全,另外list容量应该根据你的内存动态分配吧,这个不是很明白
      

  4.   

    那万一main()方法中运行到td.start();后正好时间片用完,不就可能产生ThreadDemo 线程与main()线程同时争抢CPU运行机会吗?也有可能是ThreadDemo线程先抢到啊,你怎么知道分配了多少时间片给main()线程呢?
      

  5.   

    你的List是范型,规定了类型是Integer,int是有大小范围的,改为Long