1    每一个object都有一个好像属性一样的东西(monitor),如果你的class里面有多个方法是被synchronized的话,如果这个class的一个synchronized 方法被一个线程调用的话,必须等这个方法被释放之后才可以调用这个class的其他synchronized 方法,这个是对于同一个线程来说,对于两个以上线程的话,也必须等第一个线程释放之后,第二个线程才两调用,对吧2. 同一个class里面所有的synchronized的是公用一个monitor?我的理解是monitor是对象,而且他有一个count的私有变量,当每次class被同一个线成调用的时候,他的count就加1,相反,如果线程释放一次的话,count就减少1问题:
    如果我的class里面有连个方法a和b,他们都是synchronized,而且,如果a里面对b进行了调用的话,a,能成功调用吗?   我的理解: 如果能调用成功的话,那说明monitor里面的count加1了,但是如果不成功的话,说明:
   必须等这个方法被释放之后才可以调用这个class的其他synchronized 方法.反正我觉得很矛盾,请高手帮忙.   

解决方案 »

  1.   

    〉如果你的class里面有多个方法是被synchronized的话,如果这个class的一个synchronized 方法被一个线程调用的话,必须等这个方法被释放之后才可以调用这个class的其他synchronized 方法
    monitor并不是针对class的,而是针对object的,每个对象都有一个monitor。对同一个对象的多个同步方法的访问:“对于两个以上线程的话,也必须等第一个线程释放之后,第二个线程才两调用,对吧”这句话是对的。
    第二个的理解是有问题的,一个线程拥有了某个对象的同步锁之后,其他的线程就无法获得它的同步锁,进入等待队列,这也是notify()和notifyall()两个方法工作的原理。他们是在等待队列中去唤醒其他线程的,与该对象无关的线程是不会被唤醒的。
      所以你的问题的答案是能够调用成功,但原因和你的理解是不一样的。
      上面的回答可能也有问题,等楼下的补充吧。
      

  2.   

    synchronized  应该是为了实现多线程同步吧。但是在单线程程序中这个应该没有意义的,因为程序执行方法a的
    语句的同时不可能同时执行方法b的,所以synchronized是用于多线程环境的。
      

  3.   

    刚才思考了半天,我现在的结论是这样的,不知道对不对,请大家看看:如果是同一对象的话,对于两个方法的调用肯定有先后顺序我的理解是这样的:如果在多线程的环境下,线程一如果先访问某一个对象的synchronized方法的话,实际上,这个时候,线程一已经得到了monitor,而且是将count加一了,如果A里面调用了synchronized方法B的话,count又加一,当B执行完后,count减一,当A执行完后count再减一.这个时候count = 0,线程一对Object释放,然后到线程二来执行了.上面是对一个Object来说的,如果有两个线程的话,两个对象的话,线程一访问对象一的A方法,而且线程二访问对象二的B方法的话,实际上他们之间就没有关系了,因为对象一和对象二分别有自己的monitor.
      

  4.   

    补充一点:如果是两个线程访问同一个对象的同一个同步方法,或者是不同的同步方法,谁先得到monitor的话,谁先做,等完成之后第二个线程才能执行同一个同步方法或者是不同的同步方法.
      

  5.   

    最后在补种一点:  如果是在同一个对象,两个线程要分别访问这个对象不同的方法时候,可以这样做,首先在这个class里面单独定义一个object,将方法A整个同步起来,既这样的形式:public synchronized,其实这个时候你是用当前对象做为lock的同时将方法B的只同步lock用我们定义的object,表现形式是这样:synchronized(syncObject)这样的话,当两个线程在访问同一个对象的同步方法A的时候,另一个线程同时可以访问这个对象的方法B,因为他们是在两个对象上加锁!!!