黑马程序员技术交流社区

标题: 求助 [打印本页]

作者: 王轶    时间: 2011-9-27 10:28
标题: 求助
public class TT implements Runnable {
        int b = 100;
       
        public synchronized void m1() throws Exception{
                b = 1000;
                Thread.sleep(5000);
                System.out.println("b = " + b);
        }
       
        public synchronized void m2() throws Exception {
                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("main======"+tt.b);
        }
}


----------------------------------------
1.我想问的是两个线程会同时 一个访问M1方法,一个访问M2方法。还是别的?
2.当类中有synchronized修饰的方法时,两个线程同时访问两个方法 只能先执行一个方法吗,待这个锁解开了,才执行另一个方法,还是两个能同时访问?

最好能给我回答下,越详细越好。我不是太懂
作者: 匿名    时间: 2011-9-27 11:53
java中每一个对象对应一个唯一的锁。
new TT()时这个对象和这个对象的锁就都在内存中建立了。
synchronized修饰方法,是指这个方法必须获得调用这个方法的对象的锁才能执行。
比如上面的 tt.m2(); 就是说m2()这个方法的执行必须获得调用它的对象 tt 的锁以后才能执行。
tt.m1()也是一样的。
你在主函数中调用 t.start(),虚拟机会自动调用 tt 对象里的run()方法,因为run()方法不是同步方法,所以执行run()方法不用获得 tt 这个对象的锁。而run()方法体里面调用的 m1()方法是同步的,必须获得tt 对象的锁才能执行,如果没有锁,则线程会阻塞。同时main()方法往下执行,调用 tt.m2() 方法,m2() 方法的执行必须获得 tt 的对象锁。由于 m1()和m2()方法都要获得 tt 的对象锁后才能执行,而同一时间只能有一个线程获得对象的对象锁。所以 main()方法线程和run()里调用的m1()方法线程会发生竞争,同一时间 只能有一个线程执行,另一个线程必须等待获得 tt 对象锁的 线程执行完毕之后才会执行。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2