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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© H._张_♂ 中级黑马   /  2014-3-23 21:38  /  1503 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如果有同同一个对象作为synchroized(x)的参数,该参数x如果先在一个线程中被锁定,比如锁定后sleep(10000),在这段时间里,他在其他的线程中也作为synchroized(x)的参数时,这个线程能不能正常运行啊?

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

4 个回复

倒序浏览
不能正常运行 线程被冻结了 只能等到冻结时间1000ms 结束该同步才线程才能运行
回复 使用道具 举报
  1. class  TestThread
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 new Thread(new RunClass(0)).start();
  6.                 new Thread(new RunClass(1)).start();
  7.                 System.out.println("Hello World!");
  8.         }
  9. }

  10. class RunClass implements Runnable
  11. {
  12.         int flag=0;
  13.         public RunClass(int flag)
  14.         {
  15.                 this.flag=flag;
  16.         }

  17.         public void run()
  18.         {
  19.                 String str ="";
  20.                 while(true)
  21.                 {
  22.                         if(flag==0)
  23.                         {
  24.                                 Test.fun1(str);
  25.                         }
  26.                         else
  27.                         {
  28.                                 Test.fun2(str);
  29.                         }
  30.                 }
  31.         }
  32. }

  33. class Test
  34. {
  35.         public static void fun1(String str)
  36.         {
  37.                 synchronized(str)
  38.                 {
  39.                         System.out.println("start Sleep");
  40.                         try{Thread.sleep(1000);}catch(Exception e){}
  41.                         System.out.println("end Sleep");
  42.                         System.out.println("fun1:"+str);

  43.                 }
  44.         }

  45.         public static void fun2(String str)
  46.         {
  47.                 synchronized(str)
  48.                 {
  49.                         System.out.println("fun2:"+str);
  50.                 }
  51.         }
  52. }
复制代码

你看我上面这个代码的结果中
start Sleep
end Sleep
之间是没有其他值的。也就是调用fun1的代码时,线程1 sleep了,线程2也是不执行的。因为使用的是同一个x参数

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
线程对象Sleep(10000)秒,但是他并不放弃CPU的执行权,锁还是在它的手里,所以其他同他一个锁的线程对象是不会获得CPU的执行权。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
按照我个人的理解是这样的,在线程进行sleep或者wait的时候,此时该线程是释放了执行资格个执行权的,但是它没有释放同步锁,此时,就算其他的线程得到了执行权,但是它没有得到同步锁,所以其他线程也是不能执行同步代码块或同步函数的,这就是毕老师所说的为什么线程在sleep结束或notify后会进入临时阻塞状态,当cpu切换到拥有同步锁的线程后,该线程就继续执行同步代码块或者同步函数。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

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