【发布时间】:2015-04-03 15:39:14
【问题描述】:
我从一本公认的样本书中看到了这一点,所以很难质疑,然后有一些我不明白的地方。
一个名为 DataflightsService 的类包含一个名为 FlightFileAccess 的私有静态变量,似乎每次我们为 DataflightsService 创建一个新对象时都会实例化它,因为 FlightFileAccess 在构造函数中初始化它
即
public class DataflightsService{
private static FlightFileAccess fileAccess=null;
public DataflightsService(String path){
fileAccess=new flightFileAccess(path);
}
public boolean removeflight(String code){
//We use this static instance that wraps functionality to remove a flight
fileAccess.remove(code);
}
}
对我而言,这意味着每次我们创建DataflightsService 的实例时,在构造函数中都会始终为静态变量FlightFileAccess 使用不同的对象
在原来的
FlightFileAccess类中:我们有同步RandomAccessFile的remove方法
Class FlightFileAccess{
private RandomAccessFile database = null;
private boolean remove(String code){
// Other code goes here and there
synchronized (database) {
//Perform deletion code
}
}
所以因为我们使用了FlightFileAccess 的不同引用,我们也使用了RandomAccessFile 的不同引用?
这意味着将FlightFileAccess 作为静态服务不会在此处为RandomAccessFile 上的synchronize 提供服务,因为它每次都是一个新的,所以每个DataflightsService 实例都会在随机访问文件上做他们的事情忽略同步。
与在静态启动器中实例化 FlightFileAccess 不同。我说的对吗?
我希望能提供尽可能多的解释,以提供能够实例化 DataflightsService 的最佳方式(假设每个客户端都有自己的 DataflightsService 实例),然后是例如,能够在文件上同步以进行删除,这样就不会出现多个客户端访问该文件的混乱情况。抱歉,我需要为每个客户端添加一个 DataflightsService,因为没有 cookie。
【问题讨论】:
-
请编辑您的问题并将代码格式化为代码,然后缩进。
-
仅仅因为您在书中找到建议,并不会自动使其成为好的建议。构造函数无条件分配一个静态字段?这听起来像是非常糟糕的设计。
标签: java multithreading variables static