黑马程序员技术交流社区

标题: 线程,锁问题 [打印本页]

作者: 李江    时间: 2013-7-15 11:02
标题: 线程,锁问题
本帖最后由 杨兴庭 于 2013-7-15 21:21 编辑
  1. <p>代码1:</p><p>public synchronized void set(String name)
  2.         {
  3.                  while(flag)
  4.                 try
  5.                 {
  6.                         this.wait();
  7.                 }
  8.                 catch (InterruptedException e)
  9.                 {
  10.                 }
  11.                 this.name = name;
  12.                 count++;
  13.                 System.out.println(Thread.currentThread().getName()+name+"--生产--"+count);
  14.                 flag = true;
  15.                 this.notifyAll();
  16.         }</p>
复制代码
代码2:
  1. public void set(String name) throws InterruptedException
  2.         {
  3.                 lock.lock();
  4.                
  5.                 try
  6.                 {        while(flag)
  7.                         continue_pro.await();
  8.                         this.name = name;
  9.                         count++;
  10.                         System.out.println(Thread.currentThread().getName()+name+"--生产--"+count);
  11.                         flag = true;
  12.                         continue_con.signal();
  13.                 }
  14.                 finally
  15.                 {
  16.                         lock.unlock();
  17.                 }
复制代码
问题:
代码1中的锁是什么时候释放的,为什么不放在finally里面?


作者: 草貌路飞    时间: 2013-7-15 11:11
用synchronized这种同步方式是没有主动释放锁的方法的。要不就是它执行set中的代码时没有cup使用权了就释放给其它线程了。要不就是执行完set方法还有cpu执行时间,就又获得锁再执行,然后就会执行到wait那里,也就释放锁了
作者: 李江    时间: 2013-7-15 12:13
草貌路飞 发表于 2013-7-15 11:11
用synchronized这种同步方式是没有主动释放锁的方法的。要不就是它执行set中的代码时没有cup使用权了就释放 ...

恩恩,OK,谢谢你了
作者: 杨增坤    时间: 2013-7-15 21:05
synchronized(){代码}或者是synchronized 方法名(){方法体}
当代码执行完成,或者是方法体执行完成 锁自定释放,当代码或者是方法体没有执行到最后则锁不会释放
当你进入执行代码或者进入方法体,那么就会自动加上锁。
希望对你有帮助!





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