A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王轶 黑马帝   /  2011-9-27 10:28  /  1767 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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修饰的方法时,两个线程同时访问两个方法 只能先执行一个方法吗,待这个锁解开了,才执行另一个方法,还是两个能同时访问?

最好能给我回答下,越详细越好。我不是太懂

1 个回复

倒序浏览
黑马网友  发表于 2011-9-27 11:53:34
沙发
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 对象锁的 线程执行完毕之后才会执行。

评分

参与人数 1技术分 +2 收起 理由
admin + 2 不错的同学!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马