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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 曲终烟尽 于 2015-6-8 12:31 编辑
  1. package 多线程.通信;

  2. class Res
  3. {
  4.         private String name;
  5.         private String sex;
  6.         public synchronized void setInfo(String name,String sex)
  7.         {
  8.                
  9.                         this.name=name;
  10.                         this.sex=sex;
  11.                
  12.         }
  13.         public synchronized String[] getInfo()
  14.         {
  15.                
  16.                         return new String[]{this.name,this.sex};
  17.                
  18.         }
  19.         
  20. }

  21. class Input implements Runnable
  22. {
  23.         Res r;
  24.         Input(Res r)
  25.         {
  26.                 this.r=r;
  27.         }
  28.         public void run()
  29.         {
  30.                 boolean b=true;
  31.                 while(true)
  32.                 {
  33. //synchronized(r){
  34.                         if(b)
  35.                         {
  36.                                 r.setInfo("Tom","man");
  37.                                 
  38.                         }
  39.                         else
  40.                         {
  41.                                 r.setInfo("丽丽","女");
  42.                                 
  43.                         }
  44.                         b=!b;
  45. //}
  46.                 }
  47.         }
  48. }

  49. class Output implements Runnable
  50. {
  51.         Res r;
  52.         Output(Res r)
  53.         {
  54.                 this.r=r;
  55.         }
  56.         public void run()
  57.         {
  58.                 while(true)
  59.                 {
  60. //synchronized(r){
  61.                         System.out.println(r.getInfo()[0]+"----"+r.getInfo()[1]);//造成错误的代码
  62. //}
  63.                 }
  64.         }
  65. }

  66. public class InputOutputDemo {

  67.         public static void main(String[] args) {
  68.                 // TODO Auto-generated method stub
  69.                 Res res=new Res();
  70.                 Output op=new Output(res);
  71.                 Input ip=new Input(res);
  72.                 Thread t1=new Thread(op);
  73.                 Thread t2=new Thread(ip);
  74.                 t1.start();
  75.                 t2.start();
  76.         }

  77. }
复制代码
使用Res类中的 synchronized 对两个函数进行同步结果并没有同步。
线程1在使用资源时,线程2也能使用资源。
但synchronized函数的锁是this.也就是 对象 res.this 的锁,对不对?
我还用synchronized(Res.class)代码块对getInfo函数和setInfo函数中的代码进行封装测试
  1. public void setInfo(String name,String sex)
  2.         {
  3.                 synchronized(Res.class){
  4.                         this.name=name;
  5.                         this.sex=sex;
  6.                 }
  7.         }
  8.         public String[] getInfo()
  9.         {
  10.                 synchronized(Res.class){
  11.                         return new String[]{this.name,this.sex};
  12.                 }
  13.         }
复制代码



结果也是不行,不能同步。请问是什么原因啊???


问题已自己解决。
System.out.println(r.getInfo()[0]+"----"+r.getInfo()[1]);//造成错误的代码
调用了两个getInfo,所以得到的结果会有所不同.

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马