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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王小刚 中级黑马   /  2012-4-24 14:59  /  1835 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请哪位高手能够帮忙讲解如下 java代码运行的过程?
有时候是 2000 b=1000;
有时候是 1000 b=1000(多数);

public class TT implements Runnable {
        int b = 100;
       
        public synchronized void m1() throws Exception{
                //Thread.sleep(2000);
                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(tt.b);
        }
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

2 个回复

正序浏览
同步函数也有锁。非静态同步函数的锁是this,同步函数所属对象的引用;静态同步函数的锁是:
类名.class,函数,所属类的字节码文件对象。
所以他们的锁都是同一个 所以有时候是 2000 b=1000;有时候是 1000 b=1000(多数);

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
我来告诉你为什么 因为你用了同步函数: 同步函数的锁是 类 就是你的TT类
地球人都知道线程是随机执行线程的 当 你 MAIN 线程先执行的时候 也就是说 他进入了m2()方法  那另外一条线程就不能进入m2()方法了只能在外面等待
Thread.sleep(2500);
只能等到睡眠时间过后再醒来才能去执行另外一条线程进入m1()方法  
原因是:他们的锁都是同一个  而锁同一个的话也以为着 2个方法里一次性只能有 一条线程去执行
   从某种意义上来说m2极有可能比m1先执行。
m2是直接调,m1是通过start()再去调。
OVER

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

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