本帖最后由 曲终烟尽 于 2015-6-8 12:31 编辑
- package 多线程.通信;
- class Res
- {
- private String name;
- private String sex;
- public synchronized void setInfo(String name,String sex)
- {
-
- this.name=name;
- this.sex=sex;
-
- }
- public synchronized String[] getInfo()
- {
-
- return new String[]{this.name,this.sex};
-
- }
-
- }
- class Input implements Runnable
- {
- Res r;
- Input(Res r)
- {
- this.r=r;
- }
- public void run()
- {
- boolean b=true;
- while(true)
- {
- //synchronized(r){
- if(b)
- {
- r.setInfo("Tom","man");
-
- }
- else
- {
- r.setInfo("丽丽","女");
-
- }
- b=!b;
- //}
- }
- }
- }
- class Output implements Runnable
- {
- Res r;
- Output(Res r)
- {
- this.r=r;
- }
- public void run()
- {
- while(true)
- {
- //synchronized(r){
- System.out.println(r.getInfo()[0]+"----"+r.getInfo()[1]);//造成错误的代码
- //}
- }
- }
- }
- public class InputOutputDemo {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Res res=new Res();
- Output op=new Output(res);
- Input ip=new Input(res);
- Thread t1=new Thread(op);
- Thread t2=new Thread(ip);
- t1.start();
- t2.start();
- }
- }
复制代码 使用Res类中的 synchronized 对两个函数进行同步结果并没有同步。
线程1在使用资源时,线程2也能使用资源。
但synchronized函数的锁是this.也就是 对象 res.this 的锁,对不对?
我还用synchronized(Res.class)代码块对getInfo函数和setInfo函数中的代码进行封装测试
- public void setInfo(String name,String sex)
- {
- synchronized(Res.class){
- this.name=name;
- this.sex=sex;
- }
- }
- public String[] getInfo()
- {
- synchronized(Res.class){
- return new String[]{this.name,this.sex};
- }
- }
复制代码
结果也是不行,不能同步。请问是什么原因啊???
问题已自己解决。
System.out.println(r.getInfo()[0]+"----"+r.getInfo()[1]);//造成错误的代码
调用了两个getInfo,所以得到的结果会有所不同.
|
|