1

我有一个服务器存储来自客户端的数据。每个客户都在自己的线程中工作,并且拥有一个数据对象。
这个 Data-Object 是一个自定义类,让我们调用 Data.java 包含不特定的数据,这可能是一些字节,但通常在 100kb < Data < 2mb 左右。
现在我有一个备份线程,遍历客户端列表,使用 Xstream 将它们的数据对象解析为 xml 并将其存储在数据库中。
但这安全吗?
如果客户端在备份数据时正在执行更改数据的操作(假设客户端大约每 0.1 秒发送一次请求,并且某些请求可能会持续几秒钟左右更改数据),则此数据可能已损坏。
什么是这样做的好方法?

4

1 回答 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 回答