一个类有个布尔型成员,目的是用来控制其某个方法(sychronized修饰)的访问,默认为false,如访问过该方法,则设置为true。为什在一个线程访问过后,第二个线程去访问的时候,该成员怎么又重置为fals。(对象引用没有变化,跑第一个线程的时候创建)。请对Java比较了解的同志探讨下,可能问题是出在哪?

解决方案 »

  1.   

    布尔型成员是怎么定义的,public static 、private static或其它?
    对象引用没有变化,跑第一个线程的时候创建------不明白哦,跑第一个线程的时候创建你说的那个类的实例?怎么控制的,会不会地二个线程也创建了个?
      

  2.   

    private static boolean flag=false;//感觉初始化时应该为true
    在带有synchronized方法里面:结束时flag设置为flag
      

  3.   

    嗯。就是2楼说的那样,第一个线程创建了该类的实例,以后的线程的对象引用也是指向这个实例。第一个线程调用了该实例的指定方法,然后设置布尔型变量为true(表示已访问过该方法)。然后第二个线程又引用该实例,然后也调用了该指定方法,但是布尔变量的值又给重置为false了。代码太长,下面是个简单的概貌。
    public class Myclass {
    …………
    private boolean started;
    …………
     public Myclass()
      {…………
        started = false;
       }
     public synchronized void method(){
        if(!started) {
              …………
            started = true;
        }
     }
    }
    另不明白3楼的意思,你的意思是在带有synchronized的方法里,结束时java会默认将boolean变量设置为false?
      

  4.   


    .... 说实话,这个代码是不是意思写错了?你的需求是?
    假设a、b两个线程都通过一个实例引用访问method(),a访问的时候b等待,直到最后started = true,于是后续所有的访问都是直接!started==false退出了...除非你在别的地方还有个修改个started值得地方,那么started 你就需要同步了,started是个boolean 不能添加synchronized (started){}所以你还给有类似public synchronized void setStarted(boolean b)方法。整个过程就应该是这样的啊。
      

  5.   

    问题已经找到,Debug中发现线程的执行中出了问题,感谢大家的热心。