同步块不会锁定

时间:2014-09-13 08:04:55

标签: java multithreading synchronization

落下的雪球。并且当雪球到达某个区块(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;
        }               
    }
}

2 个答案:

答案 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
}