java:全局变量在线程中是否可见

标签 java multithreading global-variables

如果我在主线程中声明一个全局变量,假设我从主线程中运行一个新线程,新线程可以访问主线程中的全局变量吗?

“msg”字符串是我要访问的变量

/* A simple banner applet.

   This applet creates a thread that scrolls
   the message contained in msg right to left
   across the applet's window.
*/
import java.awt.*;
import java.applet.*;
/*
<applet code="SimpleBanner" width=300 height=50>
</applet>
*/

public class AppletSkel extends Applet implements Runnable {
  String msg = " A Simple Moving Banner.";  //<<-----------------VARIABLE TO ACCESS
  Thread t = null;
  int state;
  boolean stopFlag;

  // Set colors and initialize thread.
  public void init() {
    setBackground(Color.cyan);
    setForeground(Color.red);
  }

  // Start thread
  public void start() {
    t = new Thread(this);
    stopFlag = false;
    t.start();
  }

  // Entry point for the thread that runs the banner.
  public void run() {
    char ch;

    // Display banner 
    for( ; ; ) {
      try {
        repaint();
        Thread.sleep(250);
        ch = msg.charAt(0);
        msg = msg.substring(1, msg.length());
        msg += ch;
        if(stopFlag)
          break;
      } catch(InterruptedException e) {}
    }
  }

  // Pause the banner.
  public void stop() {
    stopFlag = true;
    t = null;
  }

  // Display the banner.
  public void paint(Graphics g) {
    g.drawString(msg, 50, 30);
    g.drawString(msg, 80, 40);
  }
}

最佳答案

对多个线程可见的变量通常很棘手。然而,字符串是不可变的,因此这简化了情况。

它是可见的,但不能保证修改后的普通值何时可供其他线程使用。您应该将其设置为 volatile ,以便它不会在本地缓存线程。在分配 msg 之前,使用局部变量构建新字符串。

如果您打算从其他线程修改 stopFlag,它也应该是 volatile

关于java:全局变量在线程中是否可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17865256/

相关文章:

python - 皮林特 - "Using the global statement"

java - 为什么 Bluecove 需要安装 libbluetooth-dev 软件包才能运行

java - LibGDX 在实现一些 float 后在 Android 上崩溃

java - 是否有必要使原始实例变量可变?

ios - 后台播种/加载 iOS 核心数据存储

c++ - 多文件访问单例类

java - REST - 使用 Spring MVC 返回创建的对象

java - HIbernate Maven项目:没有名为EntityManager的持久性提供程序

java - 如何通过多线程避免Oracle中的重复插入

flash - Flash AS3从MovieClip访问全局变量