写这篇博客的目的,纪念之前一个项目困惑的地方。
在java多线程下,有很多操作是不安全的,比如对数据的存取,但是静态方法一般是不会出现问题,而我出现啦一个平时不常见的问题。
public class GetParmsByStr {
private static List<Object> lists;
public static List<Object> getParmsByStr(String... args){
lists=new ArrayList<Object>();
for (int i = 0; i < args.length; i++) {
lists.add(args);
}
return lists;
}}
看这段代码,在多线程情况下,就出现啦问题~!!
多线程操作代码如下
public class MThread extends Thread {
private String name;
public MThread(String a) {
name = a;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(name + "==="<pre name="code" class="java"> + GetParmsByStr.getParmsByStr(i + ""));
}super.run();}}
输出的结果
6===[0]
7===[0, 0]
0===[0, 0]
4===[0, 0]
2===[0]
3===[0]
8===[0]
1===[0]
9===[0]
出现啦多个值,但是应该只有一个!!!!!
这里的问题并不在静态方法上 而是在这里
private static List<Object> lists;
虽然使用的使用每次都
lists=new ArrayList<Object>();
我们都知道static只在内存中存在一份,可能会出现两个线程同时往一个lists放数据,所以数据会变多
而且而且这种情况出现的及其随机!!!!让你不知问题在何处!!
改进:
public static List<Object> getParmsByStr(String... args){
List<Object> lists=new ArrayList<Object>();
for (int i = 0; i < args.length; i++) {
lists.add(args);
}
return lists;
}
这样 在方法中new出来,就没有问题啦!!