黑马程序员技术交流社区

标题: 我明明加锁了啊?为什么输出结果还不同步的? [打印本页]

作者: NO?    时间: 2014-3-31 16:21
标题: 我明明加锁了啊?为什么输出结果还不同步的?
  1. import javax.management.loading.PrivateClassLoader;
  2. import java.util.*;


  3. public class A{

  4.         public static void main(String[] args) {
  5.                 Resource r=new Resource ();
  6.                 new Thread(new In( r)).start();
  7.                 new Thread(new Out(r)).start();

  8.         }

  9. }
  10. class Resource {
  11.           String name;
  12.           String sex;
  13.           
  14. }
  15. class   In implements Runnable{
  16.            private Resource r;
  17.            Object obj =new Object();
  18.             In( Resource r) {
  19.           this.r=r;
  20.            }
  21.        
  22.          public void run(){
  23.                  int x=0;
  24.                  while (true) {synchronized (obj) {
  25.                        
  26.                
  27.                          if (x==0) {
  28.                                  r.name="lilili";
  29.                                  r.sex="fimel";
  30.                                
  31.                         } else {
  32.                                
  33.                                 r.name="丽丽";
  34.                                  r.sex="女女女女女";
  35.                         }
  36.                          x=(x+1)%2;
  37.                         }
  38.                 }         
  39.          }
  40. }
  41. class Out implements Runnable{
  42.         private Resource r;
  43.         Object obj=new Object();
  44.     Out( Resource r) {
  45.   this.r=r;
  46.    }
  47.         public void run(){
  48.                 while(true){
  49.                         synchronized (obj) {
  50.                 System.out.print(r.name+"----");
  51.                 System.out.println(r.sex);
  52.         }
  53.                 }
  54. }

复制代码
输出结果如下:
丽丽----女女女女女
lilili----fimel
丽丽----女女女女女
lilili----女女女女女
丽丽----fimel
lilili----fimel
lilili----女女女女女
lilili----女女女女女
lilili----fimel
lilili----fimel
lilili----女女女女女
丽丽----女女女女女
lilili----女女女女女
lilili----fimel
lilili----女女女女女
丽丽----女女女女女
丽丽----女女女女女
lilili----女女女女女
丽丽----fimel
丽丽----女女女女女
lilili----fimel
丽丽----女女女女女
丽丽----fimel


作者: osully    时间: 2014-3-31 16:26
可是你两个obj 不是同一个啊.把obj定义到要操作的数据 的类中
作者: 一诺千金    时间: 2014-3-31 16:34
class   In implements Runnable{
           private Resource r;
          // Object obj =new Object();------------------------------------------这里
            In( Resource r) {
          this.r=r;
           }
        
         public void run(){
                 int x=0;
                 while (true) {synchronized (obj) {
                        
               
                         if (x==0) {
                                 r.name="lilili";
                                 r.sex="fimel";
                                
                        } else {
                                
                                r.name="丽丽";
                                 r.sex="女女女女女";
                        }
                         x=(x+1)%2;
                        }
                }         
         }
}
class Out implements Runnable{
        private Resource r;
        //Object obj=new Object();-------------------------------------------------这里
    Out( Resource r) {
  this.r=r;
   }
        public void run(){
                while(true){
                        synchronized (obj) {
                System.out.print(r.name+"----");
                System.out.println(r.sex);
        }
                }
}
你分贝new了两个object对象,锁不是同一个
public class A{

        public static void main(String[] args) {
                Object obj=new Object();
                Resource r=new Resource ();
                new Thread(new In( r)).start();
                new Thread(new Out(r)).start();

        }

}
作者: NO?    时间: 2014-3-31 16:38
一诺千金 发表于 2014-3-31 16:34
class   In implements Runnable{
           private Resource r;
          // Object obj =new Object( ...

oooooooo。知道了。粗心惹的祸。谢谢




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