synchronized相关

cocy_chan 2009-02-10 11:20:08
想写个线程看看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)。
不知道这是为什么呢?
另:这个同步块放着,可以起到线程安全的作用吗?不懂!
...全文
93 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenwei023 2009-02-11
  • 打赏
  • 举报
回复
可以起到同步安全,另外list容量应该根据你的内存动态分配吧,这个不是很明白
danielzhan 2009-02-11
  • 打赏
  • 举报
回复
这个段程序有两个问题.
1)使用keyword synchronized没有错,但是ArrayList本身不是ThreadSafe的.
需要通过List<Integer> list = Collections.synchronizedList(new ArrayList<Integer>());来创建List
2)10000000太大了,会出现内存溢出的错误.
fulianglove 2009-02-11
  • 打赏
  • 举报
回复
打错了
范型------〉泛型
fulianglove 2009-02-11
  • 打赏
  • 举报
回复
你的List是范型,规定了类型是Integer,int是有大小范围的,改为Long
sun_zhicheng 2009-02-11
  • 打赏
  • 举报
回复
内存溢出了呗!!
L502650 2009-02-11
  • 打赏
  • 举报
回复
路过..帮顶..
cxfcxf0126 2009-02-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bzwm 的回复:]
你的这个理解是正确的,
在执行了td.start();后,
确实要过一小段时间,才会执行run方法,
这里加了同步能起到线程安全的作用,
如果你把synchronized都去掉,
为了明显期间,你在输出这个ArrayList的长度之前,
执行下:

Java code
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}


[/Quote]
那万一main()方法中运行到td.start();后正好时间片用完,不就可能产生ThreadDemo 线程与main()线程同时争抢CPU运行机会吗?也有可能是ThreadDemo线程先抢到啊,你怎么知道分配了多少时间片给main()线程呢?
bzwm 2009-02-11
  • 打赏
  • 举报
回复
你的这个理解是正确的,
在执行了td.start();后,
确实要过一小段时间,才会执行run方法,
这里加了同步能起到线程安全的作用,
如果你把synchronized都去掉,
为了明显期间,你在输出这个ArrayList的长度之前,
执行下:

try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}


然后你再加上synchronized再测试一下。
加上synchronized的,会输出你想要的完整长度。

至于为什么很大时输出的长度总是3308743,
这个是不是ArrayList最多只能存这么多元素呢?
我不清楚了,
楼下继续!

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧