在Java中,如果两个类在同一时刻调用第三个类中的方法会发生什么?

时间:2011-01-30 13:41:12

标签: java multithreading methods contention

在我的项目中,我有一个由客户端类调用的游戏类。目前,游戏类会写入文件的路径,客户端类将从此文件中读取并清除内容。我在这里访问的冲突太多,所以想要使用另一个类作为存储路径数据的方法。但是,我想知道,如果仍然存在问题,或者如果游戏类试图调用存储类中的方法进行写入,同时客户端类在同一时刻调用存储中的方法,结果会是什么上课阅读和清除。

4 个答案:

答案 0 :(得分:8)

听起来你需要考虑线程和同步。我建议阅读“Java Concurrency in Practice”。

答案 1 :(得分:3)

在存在多个线程的情况下,您的类必须为thread safe。实现此目的的一种方法是制作同时访问的方法synchronized

这是一个让你入门的例子:

public class Test {

    public static void main(String[] args) throws Exception {
        new Thread() { public void run() { Test.method(); }}.start();
        new Thread() { public void run() { Test.method(); }}.start();
    }

    public synchronized static void method() {
        System.out.println("hello ");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {}
        System.out.println("world");
    }
}

如果没有synchronized修饰符,此程序将打印

hello 
hello    
world
world

使用 synchronized关键字,一次只能有一个线程调用method,因此程序会打印

hello 
world
hello 
world

答案 2 :(得分:2)

我假设你的两个类在不同的线程中运行,所以他们可能同时访问第三个类。他们正在读取和写入的资源的访问需要同步(互斥)。 Java有关键字“synchronized”,可以多种方式使用以防止并发修改等,有关详细信息,请参阅herehere

答案 3 :(得分:1)

理论上正确的答案是:“任何事情都可能发生”。

这两个调用可以一个接一个地运行,也可以相互交错,结果是不可预测的,可能是灾难性的。

这就是为什么Java为您提供了几种处理它的方法。

  1. 最简单(听起来)的方法是编写方法线程安全。在实践中,这通常意味着您应该只使用局部变量,并且不得修改作为参数传递给您的对象。 (没有副作用。)许多方法自动归入此类别,在这种情况下,您不必担心并发。

  2. 如果你的方法不能成为线程安全的,你需要以某种方式处理并发调用。 synchronized块是最常用的构造,但在某些情况下,volatile字段或使用Atomic*类就足够了。但是这个主题太重了,无法在一个答案中涵盖,所以我建议你阅读the concurrency tutorial