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”)编辑数据;