本帖最后由 AndyXuq 于 2012-06-06 17:10:04 编辑

解决方案 »

  1.   

    new 的时候不加,不存在多线程同时操作的问题。
      

  2.   

    锁 ,主要是用来防止多个线程 同时操作一个对象 , 就有可能出现错误。
    如果两个人 分别在两台ATM 对同一个账户取钱
    假设 他们同时读取到余额为1000 , 第一个人A 取走了800 , 此时账户余额为 1000 - 800 = 200
    然后写入数据库  此时余额字段为 200
    第二个人B 因为是和A同时读到的数据 ,所以他那边显示的数据也为1000 ,他取走500 此时账户余额为1000 - 500 = 500  , 然后写入数据库,此时数据库余额为500这样做肯定是不合理的,所以要加锁,同一个时间,只能有一条线程访问那个对象
    看到这条代码 , 笑死我了
    sychnorized(Person p = new Person()){...}
      

  3.   

    我是这样想的,synchronized既然是对对象加锁,那我New操作不是也返回一个对象么, 就像我上面的p, 我这样写
    sychnorized(Person p = new Person()){...}
    是不是就意味着我对p这个Person对象加锁了呢?
      

  4.   

    我这样写运行到是没什么问题的,有一个HelloTest类,里面就一个成员a,并有getA和setA方法 HelloTest test;
    synchronized(test = new HelloTest()){
    test.setA(5);
    System.out.println(test.getA());
    }但这样就有问题    synchronized(HelloTest test = new HelloTest()){...}
      

  5.   

    我这样写运行到是没什么问题的,有一个HelloTest类,里面就一个成员a,并有getA和setA方法
    Java code        HelloTest test;
            synchronized(test = new HelloTest()){
                test.setA(5);
                System.out.println(test.getA());
            }
    但这样就有问题
    Java code    synchronized(HelloTest test = new HelloTest()){...}
      

  6.   

    这样写没有问题,但是不会产生线程同步的效果,因为每次都是锁的新对象,synchronized(HelloTest test = new HelloTest()),对新生成的对象枷锁,好不效果。如果同步应该对同一对象枷锁。
      

  7.   

      HelloTest test;
            synchronized(test = new HelloTest()){
                test.setA(5);
                System.out.println(test.getA());
            }synchronized(test = new HelloTest()) ....
    test = new HelloTest();
    synchronized(test)  ....看下有多大区别  就像 if(flag = (1>2)){}这样也是没错的。
      

  8.   

    你这样写:
    HelloTest test;
    synchronized(test = new HelloTest()){
      test.setA(5);
      System.out.println(test.getA());
    }效果等同于:
    HelloTest test = new HelloTest();
    synchronized(test){
      test.setA(5);
      System.out.println(test.getA());
    }因为本来赋值语句最终的返回值就是等号左边,但是前者的写法比较不推荐。
    其实类似于有时候做循环:
    while ( (line = reader.nextLine()) != null)
      

  9.   

    多线程的锁是用来访问一个程序要求一个对象去访问的你new应该不在嗦的范围内吧就像卖票两个人同时售票当生一张票的时候两个人能都卖吗不可以吧是不是要一张一张的卖所以要加锁啊等进来一个人买了后才可以让另一个人进来去买票吧好好想想
      

  10.   

    这个问题感觉应该是synchronized语法的要求出入对象,第一种写法是传入对象了赋值语句(主体还是左边那个变量)符合要求,而第二种写法只是一个语句表示声明一个对象,编译器可能不识别。猜测。这个不是关注重点,重点问题是为什么要进行线程同步,为什么锁能实现线程同步?先说第一点,线程同步不是随便用的,看有没有必要,如果一个类生成的对象在整个程序中,有多个线程要使用它,这时候就需要在可能会出现线程同步问题的地方加锁,来保证每次只有一个线程使用,来确保整个程序中,数据的一致性,最简单的例子就是比如一个对象全局是唯一的,那么对这个对象属性进行操作的时候就要加锁了,保证数据一致。除非有必要一般不要加锁,影响效率。最常用的线程同步方法就是使用synchronized关键字,楼主的是用synchronized(锁对象){}这种结构来实现的,所谓的“加锁”,不是给“锁对象”加锁,是给你{}内部的代码加锁,或者更宽泛的说是给外面的对象加锁,每个对象都提供“锁”的功能,并只提供一把“钥匙”,有线程调用同步代码的时候它会跟“锁对象”要钥匙,有就给它,线程正常执行(执行完事后释放“钥匙”),下次有新的线程调用的时候没有了“钥匙”,该线程就会等待直到有“钥匙”(别的线程释放),因为钥匙只有一把,这样就保证了每次只有一个线程对该同步块就行了访问,那么要保证唯一访问就要保证“锁对象”的唯一,不能每次使用都new一个新的,那样锁的意义就没有了。说的有点多,有不对的地方大家指正。
      

  11.   

    用TBB/IPP之类的库多好,想不到现在人们还在用纯c写多线程,这种多线程都是假的啊