JavaSE:为什么2个线程互相操作同一个资源会卡住?

肉饼吞噬者 2018-10-26 04:43:47
需求:有一个共享资源对象,里面有一个boolean型变量flag,线程1将false的flag置为true,而线程2将true的flag置为false,这样不断交替执行,并显示结果。
public class Th
{
public static void main(String[] args)
{
Res r = new Res();
Mission1 m1 = new Mission1(r);
Mission2 m2 = new Mission2(r);

Thread t1 = new Thread(m1);
Thread t2 = new Thread(m2);
t1.start();
t2.start();
}
}

class Res//共享资源类
{
public boolean flag = false;
}

class Mission1 implements Runnable//线程任务1
{
private Res r;

Mission1(Res r)//构造方法,接收共享资源
{
this.r = r;
}

public void run()
{
while(true)
{
if(!r.flag)
{
System.out.println("Mission1 Run....." + r.flag);
r.flag = !r.flag;//将flag的值置反
}
}
}
}

class Mission2 implements Runnable//线程任务2
{
private Res r;

Mission2(Res r)//构造方法,接收共享资源
{
this.r = r;
}

public void run()
{
while(true)
{
// System.out.print("");
if(r.flag)
{
System.out.println("Mission2 Run....." + r.flag);
r.flag = !r.flag;//将flag的值置反
}
}
}
}


运行结果:只输出一行,程序就卡住不动了,要ctrl+c停止。

为啥会这样呢。。。程序看起来没什么问题啊

然而在使用打印语句调试的过程中,发现了个有趣的现象
如果将第56行代码System.out.println("");的注释取消,程序会就会运行一会儿,然后还是卡住。


求大神解答,不知道程序中哪里出了问题。
...全文
71 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
肉饼吞噬者 2018-11-01
  • 打赏
  • 举报
回复
找到原因了,是可见性的问题,在共享资源的boolean型变量flag上加上关键字volatile就解决了。

487

社区成员

发帖
与我相关
我的任务
社区描述
硬件使用 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧