我有一个服务器存储来自客户端的数据。每个客户都在自己的线程中工作,并且拥有一个数据对象。
这个 Data-Object 是一个自定义类,让我们调用 Data.java 包含不特定的数据,这可能是一些字节,但通常在 100kb < Data < 2mb 左右。
现在我有一个备份线程,遍历客户端列表,使用 Xstream 将它们的数据对象解析为 xml 并将其存储在数据库中。
但这安全吗?
如果客户端在备份数据时正在执行更改数据的操作(假设客户端大约每 0.1 秒发送一次请求,并且某些请求可能会持续几秒钟左右更改数据),则此数据可能已损坏。
什么是这样做的好方法?
问问题
752 次
1 回答
2
每当您更改或读取对象时,您都可以使用synchronized
或锁定对象。Lock
我还将使用一个boolean dirty;
标志,该标志true
在您更改它时设置为。这样,您的后台线程只需要保存已更改的对象。
由于客户端可能会在很长一段时间内更改数据,我会考虑使用lock.tryLock()
which 允许您尝试在不阻塞的情况下获取锁,以便线程仍然可以“备份”未锁定的对象。您可以随时重试下一个周期。
一个例子
class Data{
final Lock lock = new ReentrantLock();
boolean dirty = false;
public void setSomething(String a) {
lock.lock();
try {
// modify the Data
dirty = true;
} finally {
lock.unlock();
}
}
public void backupData(Backup backup) {
if (!lock.tryLock()) return;
try {
if (!dirty) return;
backup.for(this);
dirty = false;
} finally {
lock.unlock();
}
}
于 2012-08-09T07:29:45.453 回答