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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 张善颖 于 2013-3-19 20:45 编辑

java的wait 吊起线程的时候 会不会释放synchronized锁呢?

我现在做的其实算是一个 资源池的程序
  1. public class Ziyuan<R> {

  2.     private Hashtable<R, Boolean> tab = new Hashtable<R, Boolean>();

  3.     public void add(R r) {
  4.         synchronized (tab) {
  5.             tab.put(r, false);
  6.         }
  7.     }

  8.     //使用这个资源
  9.     public void use(R r) {
  10.         synchronized (tab) {
  11.             if (tab.containsKey(r)) {
  12.                 tab.put(r, true);
  13.                 tab.notifyAll();
  14.             }
  15.         }
  16.     }

  17.     //停止使用资源
  18.     public void release(R r) {
  19.         synchronized (tab) {
  20.             if (tab.containsKey(r)) {
  21.                 tab.put(r, false);
  22.                 tab.notifyAll();
  23.             }
  24.         }
  25.     }

  26.     //关闭系统 需要等待所有资源停止使用
  27.     public void close() throws InterruptedException {
  28.         synchronized (tab) {
  29.             while (true) {
  30.                 boolean able = true;
  31.                 for (R r : tab.keySet()) {
  32.                     if (tab.get(r)) {
  33.                         able = false;
  34.                         break;
  35.                     }
  36.                 }
  37.                 if (!able) {
  38.                     tab.wait(10000);
  39.                 } else {
  40.                     System.out.println("可以关闭了!");
  41.                     break;
  42.                 }
  43.             }
  44.         }
  45.     }
  46. }
复制代码
每次给名为tab的更改哈希表表数据时候 都会用synchronized锁上(布尔Boolean表示是否在使用),每次操作都会notify其他线程
close的时候 要判断是否所有tab的资源R都为false, 如果有一个资源在使用(有一个为true) 就tab.wait() 等待notify 但是我就是想知道跑 这个wait和notify 和 synchronized 会不会不兼容.....

请问大家如何设计这个问题?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

1 个回复

正序浏览
你只要记住wait是会放线程锁的,sleep是不会放线程锁的

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

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