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

关于把变量定义成全局变量的,线程安全有关问题!

2012-03-31 
关于把变量定义成全局变量的,线程安全问题!!Java codepublic class TestPow {private int ccprivate Stri

关于把变量定义成全局变量的,线程安全问题!!

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里面不推荐使用成员变量。

热点排行
Bad Request.