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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 暮雨 中级黑马   /  2013-9-25 21:21  /  1084 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我的疑惑是,实现两个线程同步,必须要持有一个相同的对象吗,还有就是线程的等待和唤醒为什么要用他所持有的对象进行操作,能不能建一个本身对象然后进行操作。
  1. public class Test{
  2.         static int i = 1;
  3.         public static void main(String[] args){
  4.                 Object obj = new Object();
  5.                 ThreadTwo t2 = new ThreadTwo(obj);
  6.                 ThreadOne t1 = new ThreadOne(obj,t2);
  7.                 t1.start();
  8.         }
  9. }
  10. class ThreadOne extends Thread{
  11.         private Object obj;
  12.         private Thread t;
  13.         public ThreadOne(Object obj,Thread t){
  14.                 this.obj = obj;
  15.                 this.t = t;
  16.         }
  17.         @Override
  18.         public void run(){
  19.                 synchronized(obj){
  20.                         t.start();
  21.                         while(true){
  22.                                 Test.i--;
  23.                                 System.out.println(Test.i);
  24.                                 try{
  25.                                         obj.wait();
  26.                                 }catch(Exception e){
  27.                                         e.printStackTrace();
  28.                                 }
  29.                                 obj.notify();
  30.                         }
  31.                 }
  32.         }
  33. }
  34. class ThreadTwo extends Thread{
  35.         private Object obj;

  36.         public ThreadTwo(Object obj){
  37.                 this.obj = obj;
  38.         }
  39.         @Override
  40.         public void run(){
  41.                 synchronized(obj){
  42.                         while(true){
  43.                                 Test.i++;
  44.                                 System.out.println(Test.i);
  45.                                 obj.notify();
  46.                                 try{
  47.                                         obj.wait();
  48.                                 }catch(Exception e){
  49.                                         e.printStackTrace();
  50.                                 }
  51.                         }
  52.                 }
  53.         }
  54. }
复制代码

评分

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

查看全部评分

1 个回复

倒序浏览
本帖最后由 早知道 于 2013-9-25 21:55 编辑

实现两个线程同步,是必须要持有一个相同的对象的。线程的同步其实就是个对资源的控制,一个线程访问了同步代码时,同步代码是锁住的,其他线程并不能访问。你可以将持有对象理解为一个锁,要访问同步代码必须要经过这把锁,你现在新建一个对象,对其进行操作相当于在开另一把锁,但是对于访问同步代码来说是没有意义的。

评分

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

查看全部评分

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