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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© --_.Is’攸稀 中级黑马   /  2013-11-3 16:32  /  2501 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

不理解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();不是程序都都上一步里等待了吗?怎么进入到下一步的?

评分

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

查看全部评分

6 个回复

倒序浏览
lock是在多线程中上一把锁,也就是说你调用了lock方法取得线程的锁,别的线程就不能在执行你lock下面的语句了,别的线程会一直等待,知道你调用了unlock方法,
还有finally是在try{}语句快执行完成之后调用的,如果产生了异常,执行catch后的语句快后还会执行finally中的方法
所以将unlock放在finally是最好的!

评分

参与人数 1黑马币 +3 收起 理由
乔兵 + 3

查看全部评分

回复 使用道具 举报
~﹏~ 发表于 2013-11-3 16:42
lock是在多线程中上一把锁,也就是说你调用了lock方法取得线程的锁,别的线程就不能在执行你lock下面的语句 ...

也就是说unlock放在finally里是为了安全问题,也可以不放在finally里,只要放在后面就得了?
回复 使用道具 举报
--_.Is’攸稀 发表于 2013-11-3 17:17
也就是说unlock放在finally里是为了安全问题,也可以不放在finally里,只要放在后面就得了? ...

嗯  ,是的
回复 使用道具 举报
try块中的内容是在无异常发生时执行到结束
catch块中的内容,是在try块中内容发生catch所声明的异常时,跳转到catch块执行
finally块则是无论是否发生异常,都会执行finally块的内容
所以,代码逻辑中有需要无论发生什么都必须执行的代码,则可以放在finally块中
例如:最常见的就是把关闭connection、释放资源等的代码放在finally块中

评分

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

查看全部评分

回复 使用道具 举报
finally这个语句是可选项,可以省略,也可以写上。但是如果写上了,那么它里面的语句一定会执行,不管前面有没有异常抛出,都会先执行完finally语句中的代码再结束。所以finally中语句常用来关闭资源,例如解锁、I/O链接等资源。
回复 使用道具 举报
因为finally中是一定要执行的代码。
在finally中释放锁,这样达到更安全,因为锁肯定会释放,这样会在使用的时候防止死锁。
释放锁资源。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马