黑马程序员技术交流社区

标题: 在synchroized()代码块中的疑问 [打印本页]

作者: H._张_♂    时间: 2014-3-23 21:38
标题: 在synchroized()代码块中的疑问
如果有同同一个对象作为synchroized(x)的参数,该参数x如果先在一个线程中被锁定,比如锁定后sleep(10000),在这段时间里,他在其他的线程中也作为synchroized(x)的参数时,这个线程能不能正常运行啊?
作者: 杨殿生    时间: 2014-3-23 21:41
不能正常运行 线程被冻结了 只能等到冻结时间1000ms 结束该同步才线程才能运行
作者: leon_hm    时间: 2014-3-23 22:00
  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参数
作者: 多一点    时间: 2014-3-23 23:33
线程对象Sleep(10000)秒,但是他并不放弃CPU的执行权,锁还是在它的手里,所以其他同他一个锁的线程对象是不会获得CPU的执行权。
作者: 龙健    时间: 2014-3-24 19:57
按照我个人的理解是这样的,在线程进行sleep或者wait的时候,此时该线程是释放了执行资格个执行权的,但是它没有释放同步锁,此时,就算其他的线程得到了执行权,但是它没有得到同步锁,所以其他线程也是不能执行同步代码块或同步函数的,这就是毕老师所说的为什么线程在sleep结束或notify后会进入临时阻塞状态,当cpu切换到拥有同步锁的线程后,该线程就继续执行同步代码块或者同步函数。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2