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(...)); 希望大家能够帮我解答下。谢谢。

解决方案 »

  1.   

    线程安全可能不是你以为的那个意思。假设有两个线程,同时循环执行:
    cc++
    一百万次。你认为最后cc的值是多少?
      

  2.   


    如果你的假设是每个线程分配一个独立对象,那么就没有线程安全问题了,大家访问的资源都是独立的。
    显然线程安全问题就是指大家访问的对象是同一个对象的情况,比如: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();
      

  3.   

    写错了,这样真的是两个对象了,应该是定义成RunnableTestPow tp = new TestPow();
    new Thread(tp).start();
    new Thread(tp).start();
      

  4.   


    在你使用 集合 add 的方法体内 加入 synchronized 参考 JSP设计
      

  5.   


    这样的话就是访问同一个cc,导致它会用到同一块内存,但如果定义成局部变量,如果两个对象同一时刻访问同一个函数的话,那还是有问题的,必须要加上synchronized, 那如果在不加synchronized 的前提下,定义成全局或者是局部则都会有线程安全问题了??
      

  6.   

    1楼说了,关键是否为“共享资源”。定义成static,那么就直接变成共享资源了。如果你定义成成员变量,那么可能变成共享资源。只要是共享资源,就会有线程安全问题。
    然后这种情况下,如果你直接:
    public synchronized void run() {
    这就不再是啥多线程并发了,根本就是大家排队顺序执行。
      

  7.   

    非常感谢你的回答!
    我还有一个问题: 就是当是WEB网页访问服务端的时候,如有客户端发出调用Servlet的请求,插件获得对此请求的控制并将它传递给Java容器,是单线程操作,还是多线程操作啊,当有多个客户同时访问的时候
      

  8.   

    必然是多线程并发,而且Servlet都是单例,这也是为什么Servlet里面不推荐使用成员变量。