class ThreadSix extends Thread{

ThreadSix(){
start();
}
public void run(){
playA();
         playB();
}
synchronized static void playA(){

{
System.out.println("playA  = "+TestThread.playA );
TestThread.playA++;
}
     }
void playB(){
synchronized(ThreadSix.class){    
 System.out.println("playB  = "+TestThread.playB);
 TestThread.playB++;
}
     }

}输出如下:playA  = 0
playB  = 0
playA  = 1
playB  = 1
playA  = 2
playA  = 3
playB  = 2
playA  = 4
playB  = 2
playB  = 3
playA  = 5
playB  = 5在网上找到的解释:代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。可以推断:如果一个类中定义了一个synchronized的static函数A,也定义了一个synchronized 的instance函数B,那么这个类的同一对象Obj在多线程中分别访问A和B两个方法时,不会构成同步,因为它们的锁都不一样。A方法的锁是Obj这个对象,而B的锁是Obj所属的那个Class。 
第一段说同步的static方取得的锁是对象所属类,第二段又说A方法锁的是Obj对象
这不是前后矛盾吗?我觉得两个方法都应该属于Class锁吧?
那为什么他们之间不互相同步呢,如果想让这2个方法互相之间也同步,形成以下输出。应该怎么办?playA  = 0
playB  = 0
playA  = 1
playB  = 1
playA  = 2
playB  = 2
playA  = 3
playB  = 3
playA  = 4
playB  = 4
playA  = 5
playB  = 5

解决方案 »

  1.   

    A方法的锁是Obj这个对象,而B的锁是Obj所属的那个Class。这句是错的 a锁的是对象.
      

  2.   

    你这个playA playB 的定义 
    主函数 什么都没有 程序不全啊
      

  3.   


    public class TestThread { public static int play1 = 0;
    public static int play2 = 0;

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    for(int i = 0; i < 6; i++){
    new ThreadSix();
    }
    }}
    主类在这里。。有哪里说不清楚么 没人回
      

  4.   


    class ThreadSix extends Thread{
        ThreadSix(){
            start();
        }
        public void run(){
            playA();
            playB();
        }
        synchronized static void playA(){
            System.out.println("playA  = "+TestThread.playA +",name="+ Thread.currentThread().getName());
            TestThread.playA++;
           
         }
        void playB(){
            synchronized(ThreadSix.class){       
             System.out.println("playB  = "+TestThread.playB +",name="+ Thread.currentThread().getName());
             TestThread.playB++;
            }
        }
    }
    public class TestThread {
        public static int playA = 0;
        public static int playB = 0;
        public static void main(String[] args) {
            for(int i = 0; i < 6; i++){
             try{
             new ThreadSix().join();//等待线程结束
             Thread.sleep(10);
             }catch(Exception e){
             }
            }
        }
    }
      

  5.   

    LZ想问什么?
    synchronized static和synchronized(Class)是等效的
    run方法里执行两个方法palyA,playB,在这两个方法之间,有时间分配间隙,也就说一个线程,不能保证playA执行结束以后,马上就执行playB,因为线程的调度是系统决定的,也就说线程的CPU分配是系统决定。
    这样当一个线程执行playA后(还没来得及执行playB),系统就把CPU收回,分配给另一个线程,此时因为前一个线程的playA执行结束,synchronized锁已释放,后一个线程的run是可以进入playA方法的,于是就会有playA,playA输出
    如果要到一个playA,一个playB,两者之间就需要保证没有时间分配间隙,所以把playB写到playA中即可
      

  6.   

    不知道LZ把palyA和palyB加同步干嘛?没有如何意义。
    建议LZ看下这个。http://www.javaeye.com/topic/164905