黑马程序员技术交流社区

标题: try、catch、finally里的finally的作用 [打印本页]

作者: --_.Is’攸稀    时间: 2013-11-3 16:32
标题: try、catch、finally里的finally的作用
不理解finally在这里的作用?说是释放资源,一定会执行的语句,那它是什么时候执行?按怎么顺序执行的?异常里的时候我理解,问题是我看到关于LOCK锁的那一块,
  1. public  void set(String name)throws InterruptedException
  2.         {
  3.                 lock.lock();
  4.                 try
  5.                 {
  6.                         while(flag)
  7.                                 condition_pro.await();//t1,t2
  8.                         this.name = name+"--"+count++;

  9.                         System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
  10.                         flag = true;
  11.                         condition_con.signal();
  12.                 }
  13.                 finally
  14.                 {
  15.                         lock.unlock();//释放锁的动作一定要执行。
  16.                 }
  17.         }
复制代码
那个lock.unlock();不是程序都都上一步里等待了吗?怎么进入到下一步的?

作者: ~﹏~    时间: 2013-11-3 16:42
lock是在多线程中上一把锁,也就是说你调用了lock方法取得线程的锁,别的线程就不能在执行你lock下面的语句了,别的线程会一直等待,知道你调用了unlock方法,
还有finally是在try{}语句快执行完成之后调用的,如果产生了异常,执行catch后的语句快后还会执行finally中的方法
所以将unlock放在finally是最好的!
作者: --_.Is’攸稀    时间: 2013-11-3 17:17
~﹏~ 发表于 2013-11-3 16:42
lock是在多线程中上一把锁,也就是说你调用了lock方法取得线程的锁,别的线程就不能在执行你lock下面的语句 ...

也就是说unlock放在finally里是为了安全问题,也可以不放在finally里,只要放在后面就得了?
作者: ~﹏~    时间: 2013-11-3 17:20
--_.Is’攸稀 发表于 2013-11-3 17:17
也就是说unlock放在finally里是为了安全问题,也可以不放在finally里,只要放在后面就得了? ...

嗯  ,是的
作者: hel    时间: 2013-11-3 17:43
try块中的内容是在无异常发生时执行到结束
catch块中的内容,是在try块中内容发生catch所声明的异常时,跳转到catch块执行
finally块则是无论是否发生异常,都会执行finally块的内容
所以,代码逻辑中有需要无论发生什么都必须执行的代码,则可以放在finally块中
例如:最常见的就是把关闭connection、释放资源等的代码放在finally块中
作者: 回天之力    时间: 2013-11-3 18:16
finally这个语句是可选项,可以省略,也可以写上。但是如果写上了,那么它里面的语句一定会执行,不管前面有没有异常抛出,都会先执行完finally语句中的代码再结束。所以finally中语句常用来关闭资源,例如解锁、I/O链接等资源。
作者: 杨增坤    时间: 2013-11-3 22:22
因为finally中是一定要执行的代码。
在finally中释放锁,这样达到更安全,因为锁肯定会释放,这样会在使用的时候防止死锁。
释放锁资源。





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