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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李江 中级黑马   /  2013-7-15 11:02  /  909 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 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里面?

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

3 个回复

倒序浏览
用synchronized这种同步方式是没有主动释放锁的方法的。要不就是它执行set中的代码时没有cup使用权了就释放给其它线程了。要不就是执行完set方法还有cpu执行时间,就又获得锁再执行,然后就会执行到wait那里,也就释放锁了

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
草貌路飞 发表于 2013-7-15 11:11
用synchronized这种同步方式是没有主动释放锁的方法的。要不就是它执行set中的代码时没有cup使用权了就释放 ...

恩恩,OK,谢谢你了
回复 使用道具 举报
synchronized(){代码}或者是synchronized 方法名(){方法体}
当代码执行完成,或者是方法体执行完成 锁自定释放,当代码或者是方法体没有执行到最后则锁不会释放
当你进入执行代码或者进入方法体,那么就会自动加上锁。
希望对你有帮助!

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

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