黑马程序员技术交流社区
标题:
[已解决]线程使用同步函数时遇到的一个不同步的问题
[打印本页]
作者:
曲终烟尽
时间:
2015-6-8 12:12
标题:
[已解决]线程使用同步函数时遇到的一个不同步的问题
本帖最后由 曲终烟尽 于 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,所以得到的结果会有所不同.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2