多个线程访问对象同一成员方法遇到的问题 一个类有个布尔型成员,目的是用来控制其某个方法(sychronized修饰)的访问,默认为false,如访问过该方法,则设置为true。为什在一个线程访问过后,第二个线程去访问的时候,该成员怎么又重置为fals。(对象引用没有变化,跑第一个线程的时候创建)。请对Java比较了解的同志探讨下,可能问题是出在哪? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 布尔型成员是怎么定义的,public static 、private static或其它?对象引用没有变化,跑第一个线程的时候创建------不明白哦,跑第一个线程的时候创建你说的那个类的实例?怎么控制的,会不会地二个线程也创建了个? private static boolean flag=false;//感觉初始化时应该为true在带有synchronized方法里面:结束时flag设置为flag 嗯。就是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? .... 说实话,这个代码是不是意思写错了?你的需求是?假设a、b两个线程都通过一个实例引用访问method(),a访问的时候b等待,直到最后started = true,于是后续所有的访问都是直接!started==false退出了...除非你在别的地方还有个修改个started值得地方,那么started 你就需要同步了,started是个boolean 不能添加synchronized (started){}所以你还给有类似public synchronized void setStarted(boolean b)方法。整个过程就应该是这样的啊。 问题已经找到,Debug中发现线程的执行中出了问题,感谢大家的热心。 java多线程的问题 为什么下面的代码执行完毕,结果是12test呢?搞不明白! 一个累实现一个不包含任何方法的 接口 有什么意义? 菜鸟SOS,如何实现用 JMF 播放 远程共享文件,如何实现 ? java基础 使用swt做java应用程序开发.那多窗口是乍么实现的 一个低级错误,请高手指点,在线等。 请问各位高手个错误可能是什么引起的?? 请教各位有那些web server支持java 请问各位高手,java项目经验主要包含什么东西? action方法已经过时,该用什么方法代替?谢谢 关于java 的缺省修饰符friendly
对象引用没有变化,跑第一个线程的时候创建------不明白哦,跑第一个线程的时候创建你说的那个类的实例?怎么控制的,会不会地二个线程也创建了个?
在带有synchronized方法里面:结束时flag设置为flag
public class Myclass {
…………
private boolean started;
…………
public Myclass()
{…………
started = false;
}
public synchronized void method(){
if(!started) {
…………
started = true;
}
}
}
另不明白3楼的意思,你的意思是在带有synchronized的方法里,结束时java会默认将boolean变量设置为false?
.... 说实话,这个代码是不是意思写错了?你的需求是?
假设a、b两个线程都通过一个实例引用访问method(),a访问的时候b等待,直到最后started = true,于是后续所有的访问都是直接!started==false退出了...除非你在别的地方还有个修改个started值得地方,那么started 你就需要同步了,started是个boolean 不能添加synchronized (started){}所以你还给有类似public synchronized void setStarted(boolean b)方法。整个过程就应该是这样的啊。