首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

哪位高手来举一个List出现线程安全有关问题的例子

2012-01-15 
谁来举一个List出现线程安全问题的例子?谁来举一个List出现线程安全问题的例子?[解决办法]package org.tes

谁来举一个List出现线程安全问题的例子?
谁来举一个List出现线程安全问题的例子?

[解决办法]
package org.test.test;

import java.util.ArrayList;
import java.util.List;

public class UnSafeThread extends Thread {
UnSafeObject unSafe;

int dest;

int value;

String id;

public static void main(String[] args) {
UnSafeObject unSafe = new UnSafeObject();
Thread a = new UnSafeThread(unSafe,0,3, "TA ");
Thread b = new UnSafeThread(unSafe,0,33, "TB ");
a.start();
b.start();
}

public UnSafeThread() {
}

public UnSafeThread(UnSafeObject o, int dest, int value,String id) {
unSafe=o;
this.dest=dest;
this.value=value;
this.id=id;
}

public void run() {
unSafe.l.add(dest,value);
System.out.println(id+ "的位置 "+dest+ " 现在设置为 "+value);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
unSafe.l.get(dest);
System.out.println(id+ "的位置 "+dest+ " = "+unSafe.l.get(dest));
}
}

class UnSafeObject {
List l = new ArrayList();;

static UnSafeObject obj = new UnSafeObject();

public UnSafeObject() {
}

}

[解决办法]
unSafe.l.add(dest,value); == > unSafe.l.add(dest, new Integer(value));
[解决办法]
晕,你有没有意识。有没有想过为啥用sleep

重写了个例子,再看不懂的话建议你转专业去了

package org.test.test;

import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Vector;

public class UnSafeThread <E> extends Thread {
List v;
int id;

public static void main(String[] args) {

List l = new AbstractList() {
public String get(int i) {
return " ";
}

public void add(int index, Integer element) {
}

public String remove(int index) {
if (index == 24) {
System.out.println( "正在删除 " + index + "个元素 ");
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println( "删除 " + index + "个元素结束 ");
}
if (index == 23) {
System.out.println( "正在删除 " + index + "个元素 ");
System.out.println( "删除 " + index + "个元素结束 ");
}
return " ";
}

public int size() {
return 0;
}

};
List l2 = Collections.synchronizedList(l);
Thread ta = new UnSafeThread(l, 1);
Thread tb = new UnSafeThread(l, 2);
ta.start();
tb.start();
}

public UnSafeThread(List o, int id) {
v = o;
this.id = id;
}

public void run() {
if (id == 1) {
v.remove(24);

} else {
v.remove(23);

}

}
}


[解决办法]
我用sleep(1)直接制造不安全室时刻的状况。

(像你那种用while撞大运的写法要找到那一年去阿)

并且我通过继承一个abstractlist定制了一个list。

用输出信息举了一个多线程remove时候的不安全的过程



使用匿名list的时候
----------------------------
正在删除24个元素 <------------ta
正在删除23个元素
删除23个元素结束
删除24个元素结束 <------------这时删除的是原来的第25个元素


使用匿名同步list的时候
正在删除24个元素
删除24个元素结束
正在删除23个元素
删除23个元素结束

不知道是不是你没看懂我的例子
[解决办法]
用Collections的synchronizedList方法封装一下不就没有线层安全的问题了
[解决办法]
mark

热点排行
Bad Request.