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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李会成 中级黑马   /  2013-2-5 16:33  /  1233 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-2-15 20:51 编辑

很多资料上都说sleep 不会释放锁.我做了一个小例子,感觉有点晕
  1. public class Test2 extends Thread {

  2.         int b = 100;

  3.         public void m1() throws InterruptedException {
  4.                
  5.                 System.out.println("m1 enter..");
  6.                 synchronized (this) {
  7.                         System.out.println("m1 enter synchronized block..");
  8.                         b = 200;
  9.                         Thread.sleep(5000);//?
  10.                         System.out.println("b= " + b);
  11.                 }
  12.         }

  13.         public  void m2() throws InterruptedException {
  14.                 System.out.println("m2 enter..");
  15.                 b = 500;
  16.         }

  17.         public void run() {
  18.                 System.out.println("runing ...");
  19.                 try {
  20.                         m1();
  21.                 } catch (InterruptedException e) {

  22.                         e.printStackTrace();
  23.                 }
  24.         }

  25.         public static void main(String[] args) throws InterruptedException {
  26.                 Test2 t = new Test2();
  27.                  
  28.                 t.start();

  29.                 Thread.sleep(2000);
  30.                 t.m2();

  31.         }

  32. }
复制代码
输出结果如下:
runing ...
m1 enter..
m1 enter synchronized block..
m2 enter..
b= 500
我怎么感觉最后一行输出 应该是 100呢.还有m1方法进入同步块后居然还执行m2方法了是怎么回事?
如果给m2方法 加 synchronized,结果是我想要的,想不明白....

3 个回复

倒序浏览
     朋友你的同步块是为了保证在t线程修改b的值时,其他线程不会来抢着修改,不然就会出现混乱,但是它并不能阻止其他线程去修改b的值。
你对b做了两次修改,一个线程将其修改为500,另一个线程将其修改成200。正常情形下,最终结果只可能是500或200,不会是100。说道这里我相信你比较明白了。b=500先执行的话,输出的就是200,反之亦然。
回复 使用道具 举报
其实就是m1和主线程抢CPU执行权,不是m2进了m1,是代码在m1里还没执行完就被主线程抢到了,理所应当的就执行了m2的内容
回复 使用道具 举报
请勿复制他人帖子,技术分不是入学的门槛而是为了帮助大家学习而存在的。

请勿再次发此类帖子了!

此贴就关闭了。此后如有再次发现直接封禁处理,请看到此贴的会员也加以注意。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马