日期:2014-05-20  浏览次数:20812 次

关于把变量定义成全局变量的,线程安全问题!!
Java code
public class TestPow {
     private int cc;
     private String bb;
     private ArrayList<String> add = new ArrayList<String>();
}



上面定义了三个全局变量,是不是在线程操作的时候,就不安全了,所以在线程操作的时候,是不是尽量不要定义成全局变量。。

个人感觉int ,String 是线程安全的吧, ArrayList是线程不安全的,应该改用 List list = Collections.synchronizedList(new ArrayList(...)); 

希望大家能够帮我解答下。谢谢。。。。


------解决方案--------------------
只要存在“共享资源”,就存在线程安全问题。

------解决方案--------------------
线程安全可能不是你以为的那个意思。

假设有两个线程,同时循环执行:
cc++
一百万次。

你认为最后cc的值是多少?
------解决方案--------------------
探讨
我认为一个线程会分配一个对象,所以cc是一百万

------解决方案--------------------
写错了,这样真的是两个对象了,应该是定义成Runnable

TestPow tp = new TestPow();
new Thread(tp).start();
new Thread(tp).start();
------解决方案--------------------
应该没你说的线程安全问题。。。
------解决方案--------------------
探讨
Java code
public class TestPow {
private int cc;
private String bb;
private ArrayList<String> add = new ArrayList<String>();
}



上面定义了三个全局变量,是不是在线程操作的时候,就不安全了,所以在线程操作的时候,是不是尽量不要定义成……

------解决方案--------------------
1楼说了,关键是否为“共享资源”。

定义成static,那么就直接变成共享资源了。如果你定义成成员变量,那么可能变成共享资源。

只要是共享资源,就会有线程安全问题。


然后这种情况下,如果你直接:
public synchronized void run() {
这就不再是啥多线程并发了,根本就是大家排队顺序执行。
------解决方案--------------------
必然是多线程并发,而且Servlet都是单例,这也是为什么Servlet里面不推荐使用成员变量。