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(...)); 希望大家能够帮我解答下。谢谢。
private int cc;
private String bb;
private ArrayList<String> add = new ArrayList<String>();
}
上面定义了三个全局变量,是不是在线程操作的时候,就不安全了,所以在线程操作的时候,是不是尽量不要定义成全局变量。。个人感觉int ,String 是线程安全的吧, ArrayList是线程不安全的,应该改用 List list = Collections.synchronizedList(new ArrayList(...)); 希望大家能够帮我解答下。谢谢。
cc++
一百万次。你认为最后cc的值是多少?
如果你的假设是每个线程分配一个独立对象,那么就没有线程安全问题了,大家访问的资源都是独立的。
显然线程安全问题就是指大家访问的对象是同一个对象的情况,比如:public class TestPow extends Thread {
private int cc;
public void run() {
for (int i = 0; i < 100000000; i++) cc++;
}
}然后连续两句:
new TestPow().start();
new TestPow().start();
new Thread(tp).start();
new Thread(tp).start();
在你使用 集合 add 的方法体内 加入 synchronized 参考 JSP设计
这样的话就是访问同一个cc,导致它会用到同一块内存,但如果定义成局部变量,如果两个对象同一时刻访问同一个函数的话,那还是有问题的,必须要加上synchronized, 那如果在不加synchronized 的前提下,定义成全局或者是局部则都会有线程安全问题了??
然后这种情况下,如果你直接:
public synchronized void run() {
这就不再是啥多线程并发了,根本就是大家排队顺序执行。
我还有一个问题: 就是当是WEB网页访问服务端的时候,如有客户端发出调用Servlet的请求,插件获得对此请求的控制并将它传递给Java容器,是单线程操作,还是多线程操作啊,当有多个客户同时访问的时候