黑马程序员技术交流社区
标题:
关于线程中一些问题,请问我的理解是否正确.....
[打印本页]
作者:
Shimano
时间:
2014-5-8 14:36
标题:
关于线程中一些问题,请问我的理解是否正确.....
本帖最后由 Shimano 于 2014-5-22 15:46 编辑
class Rec
{
String name;
String sex;
boolean flag = false;
}
class Input implements Runnable
{
private Rec r;
Input(Rec r)
{
this.r = r;
}
public void run()
{
int x = 0;
while(true)
{
if(x==0)
{
r.name = "Mike";
r.sex = "Man";
}else
{
r.name = "丽丽";
r.sex = "女女女女女";
}
x = (x+1)%2;
}
}
}
class Output implements Runnable
{
private Rec r;
Output(Rec r)
{
this.r = r;
}
public void run()
{
while(true)
{
System.out.println(r.name+"....."+r.sex);
}
}
}
class InputOutputDemo
{
public static void main(String[] args)
{
Rec r = new Rec();
Input in = new Input(r);
Output out = new Output(r);
Thread t1 = new Thread(in);
Thread t2 = new Thread(out);
t1.start();
t2.start();
}
}
复制代码
以下是即没有同步也没有判断的情况下的一些不安全情况:我这样的理解对不对?求证实....
1.当打印出:
null.....null
null.....null
null.....null
是因为:两个线程一旦开启,输出线程就抢到执行权,因为name和sex还没有赋值,所以只能打印出空(已经被证实)
2.当打印出:
Mike.....女女女女女
是因为:输入"Mike" "man"但是没有打印,然后又输入"丽丽" "女女女女女"但还是没有被打印,又输入"Mike"时,还没有输入"man"就被输出抢到执行权,
3.当打印出:
丽丽.....Man
是因为:输入"Mike" "man"但是没有打印,然后输入"丽丽",还没有传入"女女女女",就被输出抢到执行权,
4.如果我的猜想是正确的,理论上讲,
第一行有可能会打印出:Mike.....null这种的情况,我的猜想是不是正确的?求解答....
作者:
神马
时间:
2014-5-8 15:04
恩,你的猜想是正确的,线程刚运行时,当r.name = "Mike";刚执行完,就被输出语句抢到执行权的时候,就会出现Mike.....null这种的情况。你可以在21行:r.name = "Mike";的后面加上Thread.sleep(1000);试试,估计就很可能会出现这种情况了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2