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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

代码如下:
  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

查看全部评分

3 个回复

倒序浏览
在多线程中,wait()会让这个线程暂时休眠,sleep()也会让线程休眠,但是不同点在于,在有synchronized锁的时候wait(),让线程休眠的同时会释放这个锁,但是sleep()不会释放锁!
回复 使用道具 举报
来顶个帖子,没明白楼主想阐述什么。
回复 使用道具 举报
import java.io.*;
import java.net.Socket;
import java.util.Date;

import org.apache.commons.beanutils.BeanUtils;


public class Test {

        /**
         * @param args
         */
        public static void main(String[] args) throws Exception
    {
          Object o = new Object();
                  Thread thread = new Thread(new MyRun(o));
                  thread.start();
                  Thread.sleep(2000);
                  while(true)
                  {
                          synchronized(o)
                          {
                                  System.out.println("mainThread");
                          }
                  }
            
            
            
            
        }

}

class MyRun implements Runnable
{
        private Object o;
        public MyRun(Object o)
        {
                this.o = o;
        }
        public void run() {
                // TODO Auto-generated method stub
               
                synchronized(o)
                {
                        try {
                                o.wait();
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                   System.out.println("sonThread");
                }
        }
       
       
}


给你写了个例子,你看看

Object o = new Object();
的目的是为了两个线程使用同一对象上的锁
Thread.sleep(2000);
的目的是为了让主线程等待,确保子线程已经执行。
也就是先开始执行

synchronized(o)
                {
                        try {
                                o.wait();
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                   System.out.println("sonThread");
                }
当这里 wait 吊起线程的时候 ,你说如果没有 释放synchronized锁
你说主函数中的同步代码块还能进入执行吗???



你好好想想,使用1.5之后的Condiction会让你明白的更透彻,现在对象所很少用了

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

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