落下的雪球。并且当雪球到达某个区块(125 <= y <= 260)时,该区块一次只能允许一个雪球通过。我的代码中的问题是,它们都传递了该块。它没有锁定。
我的代码出了什么问题?请帮忙。
public void run() {
while(true){
synchronized(this){
if((y>=125)&&(y<=260)){
y+=1;
}
}
if(y>=480){
x = randomGenerator.nextInt(400);
y = 0;
}else{
y=y+1;
}
}
}
答案 0 :(得分:3)
如果每个雪球都是它自己的实例,每个雪球都会自行同步(this
),这将是无用的。为了使这段代码按照您希望的方式工作,您必须拥有所有实例可以同步的共享资源。一个很好的例子就是类对象本身:
public void run() {
while(true){
synchronized(Snowball.class){
if((y>=125)&&(y<=260)){
y+=1;
}
}
if(y>=480){
x = randomGenerator.nextInt(400);
y = 0;
}else{
y=y+1;
}
}
}
答案 1 :(得分:1)
您可以使用类级别同步进行全局锁定。
synchronized(YourClassName.class){
// Your code goes here
}