public class TT implements Runnable {
int b = 100;

public synchronized void m1() throws Exception{
//Thread.sleep(2000);
                System.out.println("m1()ing");
b = 1000;
Thread.sleep(5000);
                
System.out.println("b = " + b);
}

public  synchronized void m2() throws Exception {
 System.out.println("m2()ing");
                Thread.sleep(2500);
b = 2000;
               
}

public void run() {
try {
m1();
} catch(Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();

tt.m2();
System.out.println(tt.b);
}
}这段代码的运行结果是:m2()ing
                              2000
                              m1()ing
                              b=1000
把m2()前边的synchronized去掉后public class TT implements Runnable {
int b = 100;

public synchronized void m1() throws Exception{
//Thread.sleep(2000);
                System.out.println("m1()ing");
b = 1000;
Thread.sleep(5000);
                
System.out.println("b = " + b);
}

public   void m2() throws Exception {
 System.out.println("m2()ing");
                Thread.sleep(2500);
b = 2000;
               
}

public void run() {
try {
m1();
} catch(Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();

tt.m2();
System.out.println(tt.b);
}
}结果中b=2000了
我知道synchronized的作用是当某一线程访问带有该关键字的方法时,可以保证某一时刻只有一个线程访问该方法,其他的必须等这个线程执行完了以后才可以(即获得了索),但是在第一个程序中明明m1()和m2()是两个不同的线程去访问的,m1()是t线程访问的,m2()是主线程main()访问的,我觉得他们之前的synchronized其实是形同虚设的,因为这个关键字只保证访问同一个方法时候是互斥的,但是这里明明是两个不同的方法m1()和m2()

解决方案 »

  1.   

    很不理解为什么去掉一个m2()之前的synchonized结果就不一样了???还有就是对于第一个程序,有时结果是
              m2()ing 
             m1()ing
             2000
             b=1000
    有时却是  m2()ing
             2000
             m1()ing
             b=1000
      

  2.   

    你对synchronized理解错了,应该是这样的:
    带有synchronized关键字的方法在执行时需要获得所在对象锁,因此如果你的多个线程调用的是同一个对象的m1和m2方法,那么他们都试图获得该对象的锁,所以m1和m2之间也是互斥的。
      

  3.   

    也就是说,同一个对象内所有带synchronized关键字的方法之间,都是互斥的。
      

  4.   

    直白点,就是 带synchronized 的方法 ,如果有类实例正在调用这个方法,则 其他的线程实例调用这个方法时,需要等待,等调用者退出这个方法才能继续调用。
      

  5.   

    这个代码应该是马士兵的视频教程里的吧。楼上对synchronized的理解是正确的。我是个菜鸟。不过我觉得马老师视频里以这个例子讲解的synchronized
    有些地方并不恰当
      

  6.   

    m1 m2修改了同一个变量(共享变量),所以synchronized是有用的,线程的时间片调度问题,m1,m2的调用是不确定顺序的,
      

  7.   

    如果其他线程实例是通过与当前正在调用这个方法的实例不同的实例调用这个synchronized的方法的话,是不是还要等待呢?比如第一个线程通过object1调用该方法,第二个线程通过object2调用该方法,那么这两个线程之间还存在互斥等待的关系吗?我感觉我对synchronized的理解有问题
      

  8.   

    是不是就是说如果方法前加了synchronized,那么方法里所有的变量都要互斥访问??
      

  9.   

    哦,那要是这样说的话,那么在第一段代码中虽然执行m1()的时候其他线程不能调用m1()了(因为它前边有synchronized),但是其他线程可以去调用m2()啊,m1()前边的synchronized按您的意思只是不能再调用m1()了,但是不保证不去调用其他的方法吧。而m2()中把b改成2000了,为什么结果中b=1000呢?诚心求教,谢谢