多线程下静态方法的使用及安全性

写这篇博客的目的,纪念之前一个项目困惑的地方。

在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出来,就没有问题啦!!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值