关于把变量定义成全局变量的,线程安全有关问题!
关于把变量定义成全局变量的,线程安全问题!!Java codepublic class TestPow {private int ccprivate Stri
关于把变量定义成全局变量的,线程安全问题!!
Java codepublic 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的值是多少?
[解决办法][解决办法]写错了,这样真的是两个对象了,应该是定义成Runnable
TestPow tp = new TestPow();
new Thread(tp).start();
new Thread(tp).start();
[解决办法]应该没你说的线程安全问题。。。
[解决办法][解决办法]1楼说了,关键是否为“共享资源”。
定义成static,那么就直接变成共享资源了。如果你定义成成员变量,那么可能变成共享资源。
只要是共享资源,就会有线程安全问题。
然后这种情况下,如果你直接:
public synchronized void run() {
这就不再是啥多线程并发了,根本就是大家排队顺序执行。
[解决办法]必然是多线程并发,而且Servlet都是单例,这也是为什么Servlet里面不推荐使用成员变量。