Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java安全对象线程安全的快照_Java_Multithreading_Backup - Fatal编程技术网

java安全对象线程安全的快照

java安全对象线程安全的快照,java,multithreading,backup,Java,Multithreading,Backup,我有一个服务器存储来自客户端的数据。 每个客户端都在自己的线程中工作,并且有一个数据对象。 此数据对象是一个自定义类,let call是Data.java,包含非特定的数据,可能是一些字节,但通常在100kb左右

我有一个服务器存储来自客户端的数据。 每个客户端都在自己的线程中工作,并且有一个数据对象。
此数据对象是一个自定义类,let call是Data.java,包含非特定的数据,可能是一些字节,但通常在100kb左右 现在我有了一个备份线程,遍历客户机列表,使用Xstream将其数据对象解析为xml,并将其存储在数据库中。
但这安全吗?
如果客户端在备份数据时正在执行更改数据的操作(假设客户端大约每0,1秒发送一次请求,并且某些请求可能在整个过程中持续大约几秒更改数据),则此数据可能已损坏。

什么是一个好方法?

您可以在更改或读取对象时使用
synchronized
lock
锁定对象。我还将使用
布尔脏函数标志,每当您更改它时,该标志设置为
true
。这样,您的后台线程只需要保存已更改的对象

<>因为客户端可能会在很长一段时间内更改数据,所以我会考虑使用<代码>锁定.TyLoCK()/Case>,它允许您在没有阻塞的情况下尝试锁定,这样线程仍然可以“备份”未锁定的对象。您可以在下一个循环中重新尝试

一个例子

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();
       }
    }

谢谢,这似乎是一个很好的解决方案!您有没有一个简单的实现示例供我使用这个数据类?类数据{public Object getData(){};}//使用Data.getData().setSomething(“toSomething”)编辑数据;