Java 从全局变量读写

Java 从全局变量读写,java,arrays,global,Java,Arrays,Global,我想做的是有一个全局变量类和函数可以从/到读/写 我现在拥有的是 import java.lang.*; import lab1.Global; public class SecondProgram { public static void main ( String args[] ) { System.out.println("hi "); Global.b[0] = " zero ";

我想做的是有一个全局变量类和函数可以从/到读/写

我现在拥有的是

import java.lang.*;             
import lab1.Global;
public class SecondProgram {
     public static void main ( String args[] ) {
            System.out.println("hi ");
            Global.b[0] = " zero ";
            Global.b[1] = " One ";
            Global.b[2] = " Two ";
            Global.b[3] = " Three ";

        }
}
我创建了一个类来存储全局变量

public class Global {
  public static String a = "hi" ;
  public static String [] b;
}
当然,重要的是数组的大小不是一个硬编码的常量,而是一个变量,我可以在某个时候找到它并插入

我希望您能从代码中看到我正在尝试做什么,并且您知道如何使其工作


谢谢

我认为这是一种更好的方法,可以让你开始

import java.util.ArrayList;

public class SecondProgram {

    private static ArrayList <String>file = new ArrayList();

    public synchronized boolean  writeFile(String str){
        //wrtite file to your list
        file.add(str);
        return true;
    }
    public static void main(String args[]) {
        //read file and use the synchronized method to write it to your list
    } 
}
import java.util.ArrayList;
公营二等课程{
私有静态ArrayList文件=新ArrayList();
公共同步布尔写文件(字符串str){
//将文件写入您的列表
文件.add(str);
返回true;
}
公共静态void main(字符串参数[]){
//读取文件并使用同步方法将其写入列表
} 
}

我认为这是一种更好的方法,可以让您开始

import java.util.ArrayList;

public class SecondProgram {

    private static ArrayList <String>file = new ArrayList();

    public synchronized boolean  writeFile(String str){
        //wrtite file to your list
        file.add(str);
        return true;
    }
    public static void main(String args[]) {
        //read file and use the synchronized method to write it to your list
    } 
}
import java.util.ArrayList;
公营二等课程{
私有静态ArrayList文件=新ArrayList();
公共同步布尔写文件(字符串str){
//将文件写入您的列表
文件.add(str);
返回true;
}
公共静态void main(字符串参数[]){
//读取文件并使用同步方法将其写入列表
} 
}
我需要全局变量,因为我让线程将文本文件中的数据读取到数组中,而且在线程完成其工作后,数组及其数据保持存在是很重要的

那不行。或者至少,它不会可靠地工作(从某种意义上说,这是一个更糟糕的结果!)

在多线程Java程序中,您需要确保线程在信息从一个线程传递到另一个线程时正确同步。同步的目的有两个:

  • 防止种族状况;i、 e.一个线程试图在另一个线程读取某个值之前读取该值,以及
  • 确保线程不会因内存缓存效应而看到过时的值副本
同步简单的全局变量将非常困难。我的建议是

  • 注意上面的注释,并使用类来封装状态

  • 使用
    java.util.concurrent
    中的实用程序类来实现共享数据结构。。。并处理线程创建/管理。以ExecutorService API为例

  • 找一本关于Java并发编程的好教材。Java中的并发性并不简单,如果您不知道自己在做什么,您可以花费数小时/天/周/月来跟踪间歇性故障的原因

我需要全局变量,因为我让线程将文本文件中的数据读取到数组中,而且在线程完成其工作后,数组及其数据保持存在是很重要的

那不行。或者至少,它不会可靠地工作(从某种意义上说,这是一个更糟糕的结果!)

在多线程Java程序中,您需要确保线程在信息从一个线程传递到另一个线程时正确同步。同步的目的有两个:

  • 防止种族状况;i、 e.一个线程试图在另一个线程读取某个值之前读取该值,以及
  • 确保线程不会因内存缓存效应而看到过时的值副本
同步简单的全局变量将非常困难。我的建议是

  • 注意上面的注释,并使用类来封装状态

  • 使用
    java.util.concurrent
    中的实用程序类来实现共享数据结构。。。并处理线程创建/管理。以ExecutorService API为例

  • 找一本关于Java并发编程的好教材。Java中的并发性并不简单,如果您不知道自己在做什么,您可以花费数小时/天/周/月来跟踪间歇性故障的原因


我不提倡使用globals,但如果必须使用,您可以执行以下操作。一般来说:让每个线程建立自己的数据。完成工作后,将其数据添加到同步的全局集合(在本例中为
列表
)。然后在所有线程完成工作后阅读该集合

收集数据的全局数据库:

public class GlobalDataBroker {
    public static List<List<String>> data = Collections.synchronizedList(new LinkedList<List<String>>());
}

请注意,您应该只在完成数据编写后才开始对其进行迭代。(否则,您可能会遇到可怕的
ConcurrentModificationException

我不主张使用全局变量,但如果您必须这样做,您可以执行以下操作。一般来说:让每个线程建立自己的数据。完成工作后,将其数据添加到同步的全局集合(在本例中为
列表
)。然后在所有线程完成工作后阅读该集合

收集数据的全局数据库:

public class GlobalDataBroker {
    public static List<List<String>> data = Collections.synchronizedList(new LinkedList<List<String>>());
}

请注意,您应该只在完成数据编写后才开始对其进行迭代。(否则,您可能会遇到可怕的
ConcurrentModificationException

为什么需要全局变量?如果您担心数组的大小,请使用列表?我认为您将java与其他语言混淆了,这不是我们在java中的做法。我的意见是你应该重新设计你的程序。你到底想做什么?也许比globals更好的方法是某种
ThreadManager
类,它有一个
FileData
对象的列表,其中一个对象被传递到每个
Thread
以添加其数据。线程完成后,
ThreadManager
可以遍历数据t