better_world 2017-08-23 13:17 采纳率: 60%
浏览 832
已采纳

主线程对sign变量值的改变没有反应

完整代码如下,设想中是主线程不断查看sign变量,如果为真那么打印出“收到!”,而新建线程在2s后将sign置为真,那么这时候主线程应该打印出“收到!”了,而实际上什么也没发生。

谢谢

 class Message
{
    private boolean sign = false;
    public void setSign(boolean x)
    {
        sign = x;
    }
    public boolean getSign()
    {
        return sign;
    }
}
public class Y2017Aug22 {

    public static void main(String args[])
    {
        Message message = new Message();
        Thread thread = new Thread(new Runnable(){

            @Override
            public void run() {
                try {
                    //2s后发送信号
                    Thread.sleep(2000);
                    message.setSign(true);
                } catch (InterruptedException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
                //循环等待
                while(true);
            }

        });
        thread.start();
        //不断检查是否有信号
        while(true)
        {
            if(message.getSign())
            {
                System.out.println("收到!");        
                break;
            }
        }
    }
}

  • 写回答

2条回答 默认 最新

  • 天雨之梦 2017-08-23 14:19
    关注

    java中每个线程都会有自己的工作内存,线程总会把共享变量copy到自己的工作内存缓存起来,以后的多次读取都直接使用工作内存中的缓存,如果想要将共享变量的更改里面对其他线程可以,需要使用volatile关键字修饰。建议您去学习一下java的内存模型,以及volatile的内存语义

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题