在我的项目中,我有一个由客户端类调用的游戏类。此时游戏类写入文件的路径,客户端类将从该文件中读取并清除内容。我在这里与访问发生了太多冲突,所以想使用另一个类作为存储路径数据的方法。但是,我想知道是否仍然存在问题,或者如果游戏类尝试调用存储类中的方法进行写入,而客户端类同时调用存储中的方法,结果会怎样类阅读和清除。
问问题
1093 次
4 回答
8
听起来你需要考虑线程和同步。我建议阅读“Java 并发实践”。
于 2011-01-30T13:45:16.910 回答
3
在存在多个线程的情况下,您的类必须是线程安全的。实现这一点的一种方法是创建并发访问的方法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
于 2011-01-30T13:44:27.393 回答
1
理论上正确的答案是:“任何事情都可能发生”。
这两个调用可以一个接一个地运行,也可以相互交错,结果是不可预测的,并且可能是灾难性的。
这就是为什么 Java 为您提供了几种处理它的方法。
最简单(听起来)的方法是编写线程安全的方法。实际上,这通常意味着您应该只使用局部变量,并且不得修改作为参数传递给您的对象。(没有副作用。)许多方法自动属于这一类,在这种情况下,您不必担心并发性。
如果你的方法不能成为线程安全的,你需要以某种方式处理并发调用。
synchronized
块是最常用的构造,但在某些情况下,一个volatile
字段或使用Atomic*
类就足够了。但是这个主题太重了,无法在一个答案中涵盖,所以我建议你阅读并发教程。
于 2011-01-30T13:52:24.570 回答