package com.tool;import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;import com.bean.Teacher;
import com.bean.TeacherDAO;public class SchoolManager {
public static TeacherDAO tbao = new TeacherDAO(); private static List<Teacher> allTeacher; static {
Timer t = new Timer();
t.schedule(new TimerTask(){ @Override
public void run() {
SchoolManager.setAllTeacher();

}

}, new Date(), 1000 * 60);
} public static void setAllTeacher() {
allTeacher = SchoolManager.tbao.findAll();
System.out.println(allTeacher.get(0).getTname()+"================================");
} public static List<Teacher> findAllTeacher() {
return allTeacher;
}}
问 调用findAllTeacher()方法时 allTeacher的值用的是哪个??别的都不看只问它的执行顺序。

解决方案 »

  1.   

    SchoolManager在加载的时候会启动一个定时器去调用setAllTeacher方法给allTeacher赋值,并且每隔一分钟重复调用一次。如果调用findAllTeacher获取allTeacher的值,那么这个值是最近一下赋值的结果
      

  2.   

    不确定。
    在执行static块的时候allTeacher是为null,执行完static块它可能已经有值了,也可能还是null因为给它做赋值是在另外一个线程中做的,先不说allTeacher的可见性问题,另外一个线程什么时候执行完全靠jvm或os的调度。调度顺序是随机的再说可见性问题,即使Timer中给allTeacher赋值了,但在main线程中仍然有看不到这个值的可能性,不单单是主线程,所有其它线程都有可能看不见这个allTeacher的值
      

  3.   

    哦,知道了.  原来是线程问题.怪不得第一次调用allTeacher是空值,  而等一分钟后就有值了.  
      

  4.   

    求教 怎么修改能使findAllTeacher()调用时,allTeacher的值是被setAllteacher()赋过值的?   
      

  5.   

    schedule之前直接调下setAllTeacher,同时allTeacher要用volatile修饰
      

  6.   


    java变量的初始化及赋值
    http://3aj.cn/article/1612.html