我有一个同步的问题,比如说List的子类有ArrayList和Vector,ArrayList是非同步的,线程不安全;Vector是同步的,线程安全。但是我们用java做web的时候,很多用户同时访问服务器,也算是多线程吧,那这样就不应该用ArrayList,而使用Vector,但是看别人写的代码,几乎都使用ArrayList,那这样就是非同步了。
所以我想问问,这个同步synchronized到底怎么理解? 

解决方案 »

  1.   

    嗯,同步不同步的,问题不在于理解“同步”二字。在这里,我们需要的是线程安全。ArrayList,如果它线程不安全,那你也要确定是不是多于1个线程,在同一个时间去访问它才有意义啊。如果你确定在同一个时间,有两个,或者更多线程读写ArrayList,那你就synchronized就行了。
      

  2.   

    如在ArrayList添加一个对象,要在多线程中保证每次操作安全,需要同步。而你所说的web中一般是每个线程访问的是不同的ArrayList,就相当于单线程操作一个ArrayList,所以不用考虑线程安全。当然如果想让ArrayList变得线程安全,最简单的就是试用同步包装器。
      

  3.   

    在web开发中如果ArrayList是类中的一个全局变量的话就要考虑同步的问题了,但是如果单单是这个变量只用读取操作的时候的话就不需要考虑是否同步了,如果确实在同步的话就synchronized加上对象锁
      

  4.   

    ArrayList是线程不安全的,但是web服务器会对它进行管理的
      

  5.   

    servlet本身是非线程安全的,你的担心是对的。如果一个ArrayList放在了成员变量是有很多类公用或者很多方法调用修改等等时,
    那么使用他的地方常常会加同步,因为会出现多线程。但是如果只是放在方法的局部变量中,只是方法自己用,或者只有一个线程会访问到,
    那么是没必要同步的,从效率考虑,所以不使用vector。
      

  6.   

    JDK的线程同步,用synchronizate关键字来做,ArrayList做成同步锁定的变量来控制多个访问该ArrayList的线程的同步
      

  7.   

    [b]synchronized  可以使进程间互相传递更安全,有效避免了同一个数据对象被多个线程同时访问。
    列子中,要等一个线程完成run()后,将权限交接给第二个线程,才执行第二个线程.
    synchronized 相当于将一个线程加了一把锁简单的就介绍到这里你看程序[/b]public class TestSync implements Runnable {
      Timer timer = new Timer();
      public static void main(String[] args) {
        TestSync test = new TestSync();
        Thread t1 = new Thread(test);
        Thread t2 = new Thread(test);
        t1.setName("t1"); 
        t2.setName("t2");
        t1.start(); 
        t2.start();
      }
      public void run(){
        timer.add(Thread.currentThread().getName());
      }
    }class Timer{
      private static int num = 0;
      public synchronized void add(String name){ 
       //synchronized (this) {
        num ++;
        try {Thread.sleep(1);} 
        catch (InterruptedException e) {}
        System.out.println(name+", 你是第"+num+"个使用timer的线程");
      //}
      }
    }
      

  8.   

    对于一些公共能访问的变量,需要用synchronized,但是对于一个方法内部定义的就不用,例如在servlet中:class AServlet extends HttpServlet {
    private ArrayList aList;//在对它的操作中需要synchronized以保证线程安全
    public synchronized addToList(Object item) {
    aList.add(item);
    }
    public void service(){//省略service的完整声明
    ArrayList bList;//这里可以直接操作,不用synchronized
    }
    }
      

  9.   

    你的那些类说是线程安全是因为对所有方法都进行了synchronized,简单来说,一个线程使用了这个对象,其他线程就必须等着执行完synchronized方法,synchronized只是保证那些类的成员同步.synchronized的实质还是锁,类中synchronized,wait等使用了类中隐藏的锁,java核心技术上是这么说的.
      

  10.   

    synchronized加对象锁,那就一次只有一个线程能进去
      

  11.   

    synchronized是锁住大家的公有资源,不是锁住你个人的私有资源(一般每个人都有自己的一份,自己访问自己的),加不加锁是要看外界会不会有有两个或两个以上线程同时访问一份公有资源
      

  12.   

       现在的web开发框架比如spring,我们的业务对象,特别是有状态的对象,一般作用域都是prototype的,所以这些对象根本不会在多个线程中共享,arrayList作为这些对象的属性,当然就不存在线程安全的问题。相反,如果你把这些对象的作用域改为singleton试试,程序马上会出现线程安全问题。
        所以线程安全不是不存在,而是在框架级别被解决了。
      

  13.   

    如果一个ArrayList放在了成员变量是有很多类公用或者很多方法调用修改等等时,使用他的地方常常会加同步,因为会出现多线程。
      

  14.   

    你对线程安全理解的不对,是多个线程操作一个对象时存在线程安全问题,web上的多用户是创建多个对象的,虽然是多线程,但线程操作的对象不一样,所已它是线程安全的