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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李东城 中级黑马   /  2013-2-7 14:09  /  1625 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class TT implements Runnable {
  2. int b = 100;

  3. public synchronized void m1() throws Exception{
  4.   //Thread.sleep(2000);
  5.   b = 1000;
  6.   Thread.sleep(1000);
  7.   System.out.println("b = " + b);
  8. }

  9. public synchronized void m2() throws Exception {
  10.   b = 2000;
  11.   Thread.sleep(10500);
  12.   
  13.   System.out.println(b);
  14. }

  15. public void run() {
  16.   try {
  17.    m1();
  18.   } catch(Exception e) {
  19.    e.printStackTrace();
  20.   }
  21. }

  22. public static void main(String[] args) throws Exception {
  23.   TT tt = new TT();
  24.   Thread t = new Thread(tt);
  25.   t.start();
  26.   tt.m2();
  27.   
  28. }
  29. }
  30. 程序运行结果是2000
  31. b = 1000,既m2先执行完,再执行m1方法。可2个方法都上锁了,应该是m1执行完才解锁后开始执行M2才对啊?
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

3 个回复

倒序浏览
同步函数是有作用的,只是线程间执行权的抢夺问题.

t.start();//开启t线程
tt.m2();//这一句可以理解为main()线程   也就是主线程.

在程序执行的过程中,主线程和t线程都有执行资格,
相互抢夺执行权
所以两个线程有可能执行,

如果主线程先执行的话,也就是tt.m2();这一句先执行,先打印2000,然后m1()再执行,打印b=1000


同步函数就是只要有人进来就上锁,所有用this锁的同步就都锁上了.





  

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
public class TT implements Runnable {
int b = 100;

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

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

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();
  
}
}
程序运行结果是2000
b = 1000,既m2先执行完,再执行m1方法。可2个方法都上锁了,应该是m1执行完才解锁后开始执行M2才对啊?

因为抬头tt 和t 不是同一个对象 而同步函数的默认锁是this  不同对象的不同锁  这两个方法也就不同了 在说你那个也不是m1 是线程对象调用的 而M2方法就是普通的方法调用 所以你这个不存在同步。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
张庚 发表于 2013-2-7 15:37
public class TT implements Runnable {
int b = 100;

哦,是这样啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马