Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 允许同时进行两次访问的同步方法_Java_Multithreading - Fatal编程技术网

Java 允许同时进行两次访问的同步方法

Java 允许同时进行两次访问的同步方法,java,multithreading,Java,Multithreading,我有以下方法 public synchronized void run() { while (done.get()!=true) { System.out.println(">>> Golfer #"+ myID + " trying to fill bucket with "+getBallsPerBucket()+" balls."); golferBucket = sharedStash.getBucketBalls();

我有以下方法

public synchronized void run() 
    {

while (done.get()!=true) {

        System.out.println(">>> Golfer #"+ myID + " trying to fill bucket with "+getBallsPerBucket()+" balls.");
        golferBucket = sharedStash.getBucketBalls();
                    if(golferBucket.length == 0){
                        try {
                            sleep(1000);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(Golfer.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
        System.out.println("<<< Golfer #"+ myID + " filled bucket with "+getBallsPerBucket()+" balls, size = "+sharedStash.getSizeStash());
public synchronized void run()
{
while(done.get()!=true){
System.out.println(“>>>Golfer#”+myID+”试图用“+getBallsPerBucket()+”balls.”填充桶;
golferBucket=sharedStash.getBucketball();
如果(golferBucket.length==0){
试一试{
睡眠(1000);
}捕获(中断异常例外){
Logger.getLogger(Golfer.class.getName()).log(Level.SEVERE,null,ex);
}
}

您现有的方法不起作用。在一篇评论中,您声明您的方法在不同的类中


如果这两个方法在不同的类中,在方法定义中使用synchronized关键字将没有帮助。在方法定义中使用synchronized时,synchronized等同于在类定义上同步

这:

相当于:

public class MyClass{
  public void aMethod(){
    synchronized(this){
       // do stuff
    }
  }
}
这意味着run()方法和getBucketBalls()没有使用同一个对象来控制访问。如果它们没有在同一个对象上同步,则没有任何东西可以阻止它们同时运行

如果要同步两个不同类中的方法,则需要创建一个对象,它们都可以用作锁,例如:

Object lockObj = new Object();

public void aMethod(){
  synchronized(lockObj){
    // do stuff
  }
}
lockObj可以是任何对象,所以在您的情况下

public void run(){
  synchronized(ballStash){
     // do work
  }
} 

public void getBucketBalls(){
  synchronized(ballStash){
    // do work
  }
}

请提供一个MCVE。哦,我明白了,我添加了示例输出,线程都说它们的线程大小为10,但应该说是15然后是10,我得到的输出没有意义,因为一个线程应该先执行,然后值为15,而不是10。当在方法定义中使用时,synchronized会导致在clas上获取锁在方法执行之前拥有该方法的。您的两个方法在同一个类中吗?不,第一个run()方法在Golfer类中,第二个getBucketBalls()在BallStash类中。它们应该在同一个类中吗?那么我如何将其用于run()呢方法?这个解释没有任何意义。
如果这两个方法在不同的类中,在方法定义中使用synchronized关键字没有帮助。
您的意思是,不能添加方法级同步以防止两个外部类同时访问该方法?线程级同步当多个线程试图访问同一方法时,该方法可以正常工作。如果同一对象对多个线程可见,则方法级同步足以防止并发访问。@TechTrip您能帮我吗?我需要一个完整的上下文示例。@TechTrip-我的示例的第一部分是演示为什么Daniel的方法行不通。他说他的方法在不同的类中。
public class MyClass{
  public void aMethod(){
    synchronized(this){
       // do stuff
    }
  }
}
Object lockObj = new Object();

public void aMethod(){
  synchronized(lockObj){
    // do stuff
  }
}
public void run(){
  synchronized(ballStash){
     // do work
  }
} 

public void getBucketBalls(){
  synchronized(ballStash){
    // do work
  }
}