谁能告诉一下 这两段java代码的区别啊 运行结果总是不一样
flag=false;if(flag){try{this.wait();}catch(InterruptedExceptione){}}else{this.name=na...
flag = false;
if(flag){
try{this.wait();}catch(InterruptedException e){}
}
else{
this.name = name;
this.sex = sex;
flag = true;
this.notify();
}
和下面这一段
flag = false;
if(flag){
try{this.wait();}catch(InterruptedException e){}
}
this.name = name;
this.sex = sex;
flag = true;
this.notify();
class Resource
{
private String name;
private String sex;
private boolean flag = false;
public synchronized void set(String name,String sex)
{
if(flag)
try{this.wait();}catch(InterruptedException e){}
this.name = name;
this.sex = sex;
flag = true;
this.notify();
}
public synchronized void out()
{
if(!flag)
try{this.wait();}catch(InterruptedException e){}
System.out.println(name+"...+...."+sex);
flag = false;
notify();
}
} 展开
if(flag){
try{this.wait();}catch(InterruptedException e){}
}
else{
this.name = name;
this.sex = sex;
flag = true;
this.notify();
}
和下面这一段
flag = false;
if(flag){
try{this.wait();}catch(InterruptedException e){}
}
this.name = name;
this.sex = sex;
flag = true;
this.notify();
class Resource
{
private String name;
private String sex;
private boolean flag = false;
public synchronized void set(String name,String sex)
{
if(flag)
try{this.wait();}catch(InterruptedException e){}
this.name = name;
this.sex = sex;
flag = true;
this.notify();
}
public synchronized void out()
{
if(!flag)
try{this.wait();}catch(InterruptedException e){}
System.out.println(name+"...+...."+sex);
flag = false;
notify();
}
} 展开
3个回答
展开全部
单看这两段代码的逻辑步骤,运行结果是一样的。
但是你玩了线程就可能不一样了。
this.name = name;this.sex = sex;flag = true;
如果你能保证以上三个变量是每个线程独有,那运行结果就是一样的。
还可以设置代码同步块,把这一块代码同步,也可以。
但是你玩了线程就可能不一样了。
this.name = name;this.sex = sex;flag = true;
如果你能保证以上三个变量是每个线程独有,那运行结果就是一样的。
还可以设置代码同步块,把这一块代码同步,也可以。
更多追问追答
追问
我把正确代码写在问题上了 是个同步函数
不过 加不加else有什么区别啊?
如果加的话 怎么加才合适呢
追答
else不是重点。
重点是线程安全。
你别去纠结这个else。在单线程或者同步函数状态下加不加else都一样。
你刚才开始写那2个函数就算是一模一样,在多线程情况下执行结果也是不同的。
不知道这么讲,你可懂。
展开全部
主线程 a线程 b线程
第一段 flag = true,执行完毕 等待 等待
第二段 flag = true 执行完毕 执行完毕 执行完毕
wait() 当前线程暂停,其他线程占领cpu,运行态=>关注flag是否为synchronized
notify() 唤醒可运行态的thread,让他们等待cpu分配来execute.注意理解每条线程的变量(global,private,synchronized).
以上
第一段 flag = true,执行完毕 等待 等待
第二段 flag = true 执行完毕 执行完毕 执行完毕
wait() 当前线程暂停,其他线程占领cpu,运行态=>关注flag是否为synchronized
notify() 唤醒可运行态的thread,让他们等待cpu分配来execute.注意理解每条线程的变量(global,private,synchronized).
以上
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
运行效果是一样的,只有flag=true时运行效果才不一样。
前者只运行try{this.wait();}catch(InterruptedException e){}
后者不光运行try{this.wait();}catch(InterruptedException e){}
后面的代码
this.name = name;this.sex = sex;flag = true;this.notify();
也会运行。
前者只运行try{this.wait();}catch(InterruptedException e){}
后者不光运行try{this.wait();}catch(InterruptedException e){}
后面的代码
this.name = name;this.sex = sex;flag = true;this.notify();
也会运行。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询