java 里面arraylist 是线程不安全的?这样的代码怎么解释

码隆 2012-04-10 10:26:46
package com.test;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executors;

public class Test {
private List<String> muster=new ArrayList<String>();
public Test(){
Executors.newSingleThreadExecutor().execute(new Runnable(){
@Override
public void run() {
try {
int i=1;
while(true){
muster.add(""+i);
System.out.println("放入数据 " + i++);
Thread.sleep(new Random().nextInt(1000));
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}});
Executors.newSingleThreadExecutor().execute(new Runnable(){
@Override
public void run() {
try {
while(true){
if(muster.size()>0){
System.out.println("移除数据 " + muster.remove(0));
}
Thread.sleep(new Random().nextInt(1000));
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}});

}

public static void main(String[] args) {

new Test();

}

}
...全文
311 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
龙四 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 的回复:]

引用 22 楼 的回复:

引用 19 楼 的回复:

引用 17 楼 的回复:

另外,你没测试出来的,并不表示不存在,那是个定时炸弹
ok,能否帮我 让这个程序出现 多线程访问出现问题 ,帮帮忙!谢谢



“我现在是学习 怎么尽量不剁到手”

你太死脑筋了,这问题不一定能出现的

我告诉你为什么

jvm有一份规范,叫java虚拟机规范,下载地址在这……
[/Quote]


。。。是从根本上避免问题的出现,not回避
码隆 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

另外,你没测试出来的,并不表示不存在,那是个定时炸弹
[/Quote] ok,能否帮我 让这个程序出现 多线程访问出现问题 ,帮帮忙!谢谢
码隆 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

我说菜刀能把手剁了,你说你用了十几年没出事,这样的争论有意义吗?
[/Quote] 既然知道刀会剁到手,我现在是学习 怎么尽量不剁到手, 不知道你是否 可以解答这个问题。。
龙四 2012-04-10
  • 打赏
  • 举报
回复
另外,你没测试出来的,并不表示不存在,那是个定时炸弹
龙四 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

引用 12 楼 的回复:

引用 10 楼 的回复:

引用 8 楼 的回复:

引用 6 楼 的回复:

引用 1 楼 的回复:

存在线程安全问题
可是运行就是没有出问题


主流的jvm下都试了么,启动JIT优化的的模式下都试了么,不同的jvm版本都试了么,不同的操作系统下都试了么
没有。。难道 因为不同的jvm 多线程 操作 arraylist ……
[/Quote]

我想说的是运行模式不同,结果可能是不同的
shine333 2012-04-10
  • 打赏
  • 举报
回复
我说菜刀能把手剁了,你说你用了十几年没出事,这样的争论有意义吗?
码隆 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 10 楼 的回复:

引用 8 楼 的回复:

引用 6 楼 的回复:

引用 1 楼 的回复:

存在线程安全问题
可是运行就是没有出问题


主流的jvm下都试了么,启动JIT优化的的模式下都试了么,不同的jvm版本都试了么,不同的操作系统下都试了么
没有。。难道 因为不同的jvm 多线程 操作 arraylist 就没事?



看我4楼的……
[/Quote] 试了,请问下。。和我现在的 。。代码有相似之处吗?
码隆 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

看你这程序,即使问了问题你也不一定发现的了,第一个线程add进list的元素第二个线程可能看不到,这个你怎么发现
[/Quote] 可以发现问题,第二个按 顺序打印添加进 list的数据,i是从 1开始,如果我取出的i 不是 连续的,就有问题,但是现在是连续的
龙四 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 8 楼 的回复:

引用 6 楼 的回复:

引用 1 楼 的回复:

存在线程安全问题
可是运行就是没有出问题


主流的jvm下都试了么,启动JIT优化的的模式下都试了么,不同的jvm版本都试了么,不同的操作系统下都试了么
没有。。难道 因为不同的jvm 多线程 操作 arraylist 就没事?
[/Quote]


看我4楼的代码,试试
龙四 2012-04-10
  • 打赏
  • 举报
回复
看你这程序,即使问了问题你也不一定发现的了,第一个线程add进list的元素第二个线程可能看不到,这个你怎么发现
码隆 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 6 楼 的回复:

引用 1 楼 的回复:

存在线程安全问题
可是运行就是没有出问题


主流的jvm下都试了么,启动JIT优化的的模式下都试了么,不同的jvm版本都试了么,不同的操作系统下都试了么
[/Quote] 没有。。难道 因为不同的jvm 多线程 操作 arraylist 就没事?
码隆 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

单任务线程池,newSingleThreadExecutor
创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。
[/Quote] 和我问得 没有多大关系把。。。。。
龙四 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 1 楼 的回复:

存在线程安全问题
可是运行就是没有出问题
[/Quote]

主流的jvm下都试了么,启动JIT优化的的模式下都试了么,不同的jvm版本都试了么,不同的操作系统下都试了么
码隆 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

所以,我推荐,任何代码的测试都应该在启用JIT优化的情况下进行
[/Quote] 不懂,麻烦指点指点
码隆 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

存在线程安全问题
[/Quote] 可是运行就是没有出问题
龙四 2012-04-10
  • 打赏
  • 举报
回复
所以,我推荐,任何代码的测试都应该在启用JIT优化的情况下进行
龙四 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 1 楼 的回复:

存在线程安全问题
但是我运行了很久,没有问题。。。
[/Quote]


这个。。。

与jvm实现有关,与平台有关,与优化模式有关

譬如以下代码:
public class Visibility {
private static boolean stop;

public static void main(String[] args) throws Exception {
new Thread(new Runnable(){
public void run() {
int i = 0;
while(!stop) {
i++;
}
System.out.println("finish loop,i=" + i);
}
}).start();


Thread.sleep(1000);
stop = true;
Thread.sleep(2000);
System.out.println("finish main");
}
}


你在win hotspot下直接java Visibility运行永远也不会出问题

但是一旦java -server Visibility就死循环了
码隆 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

存在线程安全问题
[/Quote] 但是我运行了很久,没有问题。。。
阿甘1976 2012-04-10
  • 打赏
  • 举报
回复
单任务线程池,newSingleThreadExecutor
创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。
龙四 2012-04-10
  • 打赏
  • 举报
回复
存在线程安全问题
加载更多回复(5)

50,541

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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