黑马程序员技术交流社区

标题: 线程同步问题 [打印本页]

作者: 暮雨    时间: 2013-9-25 21:21
标题: 线程同步问题
我的疑惑是,实现两个线程同步,必须要持有一个相同的对象吗,还有就是线程的等待和唤醒为什么要用他所持有的对象进行操作,能不能建一个本身对象然后进行操作。
  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. }
复制代码

作者: 早知道    时间: 2013-9-25 21:48
本帖最后由 早知道 于 2013-9-25 21:55 编辑

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2