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条)

报告相同问题?

悬赏问题

  • ¥60 pb数据库修改或者求完整pb库存系统,需为pb自带数据库
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路