想写个线程看看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)。
不知道这是为什么呢?
另:这个同步块放着,可以起到线程安全的作用吗?不懂!
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)。
不知道这是为什么呢?
另:这个同步块放着,可以起到线程安全的作用吗?不懂!
在执行了td.start();后,
确实要过一小段时间,才会执行run方法,
这里加了同步能起到线程安全的作用,
如果你把synchronized都去掉,
为了明显期间,你在输出这个ArrayList的长度之前,
执行下:try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
然后你再加上synchronized再测试一下。
加上synchronized的,会输出你想要的完整长度。至于为什么很大时输出的长度总是3308743,
这个是不是ArrayList最多只能存这么多元素呢?
我不清楚了,
楼下继续!
1)使用keyword synchronized没有错,但是ArrayList本身不是ThreadSafe的.
需要通过List<Integer> list = Collections.synchronizedList(new ArrayList<Integer>());来创建List
2)10000000太大了,会出现内存溢出的错误.