IHaveNoHair 2020-04-22 03:17 采纳率: 0%
浏览 75

为什么Timer的run函数不能访问静态linkedlist,结果为空,但是静态的long却正常读取

这是JAVA
首先,我在h包里定义了一个CPU类,含有两个静态变量

package h;

import java.util.LinkedList;

public class CPU {
  public static LinkedList<Long> timeLinked = new LinkedList<>();
  public static long timeLong;
}

在m包定义了Test类,是线程内调用了Timer定时器,每个固定时间读取CPU类里的2个静态变量。
我在主函数中自增了long类型的静态变量timeLong,且每次自增后将其加入Linkedlist类型的静态变量timeLinked,然后输入它们俩。

package m;

import h.CPU;

import java.util.Timer;
import java.util.TimerTask;

public class Test implements Runnable{

  @Override
  public void run() {
    System.out.println("timeLinked:"+CPU.timeLinked.toString());
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
      @Override
      public void run() {
        System.out.println("timeLong:"+CPU.timeLong);
//        System.out.println("timeLinked:"+CPU.timeLinked.toString());
      }
    },0,500);
  }

  public static void main(String[] args) {
    Test test = new Test();
    test.run();

    while (true){
      CPU.timeLong ++;
      CPU.timeLinked.add(CPU.timeLong);
    }
  }
}

当运行Test时,程序可以正常
当我把前面的

System.out.println("timeLinked:"+CPU.timeLinked.toString());

注释,后面那句取消注释后,
在Timer定时器对应的run方法里访问timeLong是可以正常显示的,但是timeLinked却产生了报错,这是为什么呢?同样是静态变量,为什么静态的linkedlist就不能访问呢?

  • 写回答

1条回答 默认 最新

  • weixin_43983999 2023-06-15 13:54
    关注

    线程安全问题:由于LinkedList不是线程安全的容器,多个线程访问时可能会导致不同步问题,例如线程同时插入元素,可能导致链表元素丢失或其他奇怪的结果。
    可以使用synchronized关键字来实现对LinkedList的同步访问。例如,可以在对静态LinkedList进行访问和修改操作时使用synchronized语句块以确保线程安全

    评论

报告相同问题?

悬赏问题

  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入