2012-03-21 2 views
1

Учитывая это следующий код:Что такое состояние блокировки после десериализации

import java.io.Serializable; 
import java.util.concurrent.locks.ReentrantLock; 

class Data 
{ 
    private int value; 

    Data (int value) 
    { 
     this.value = value; 
    } 
} 

public class InfoCollection implements Serializable 
{ 
    private Data[] data; 
    private static final long serialVersionUID = 1L; 
    private transient ReentrantLock _lock = new ReentrantLock(); 

    public InfoCollection (int datasize) 
    { 
     this.data = new Data[datasize]; 
    } 

    public setData (Data newdata, int index) 
    { 
     _lock.lock(); 

     try 
     { 
      this.data[index] = newdata; 
     } 
     finally 
     { 
      _lock.unlock(); 
     } 
    } 
} 

Скажем, я создаю объект типа InfoCollection и сериализовать его. Через некоторое время я десериализую его и хочу его использовать. После десериализации, в каком состоянии будет поле _lock? Заблокировано или разблокировано? null или нет? Зачем ?

Это можно легко узнать, выполнив это и проверив состояние блокировки, но я хочу понять это логически.

Я думаю, что после десериализации загрузка класса/объекта вызовет вызов конструктора ReentrantLock (поскольку конструктор вызывается вне любого метода/конструктора), который даст вам разблокированный объект в результате. Я прав ?

ответ

1

В вашем примере замок будет нулевым.

_lock - в переходный период - он не сохраняется - поэтому он не будет восстановлен. Конструктор не будет называться

частный переходный период ReentrantLock _lock = new ReentrantLock();

( ПРИМЕЧАНИЕ

данных не сериализации, вы не имеете метод, реализованный:

private void writeObject(java.io.ObjectOutputStream out) 
    throws IOException 
private void readObject(java.io.ObjectInputStream in) 
    throws IOException, ClassNotFoundException; 

)

+0

да, я забыл сделать 'Data' сериализации. Виноват. Предположим, что он отмечен как Serializable. Как я могу сделать '_lock' не null после десериализации БЕЗ предоставления внешнего доступа к' _lock'? Я знаю, что могу просто удалить ключевое слово «переходный». Но действительно ли имеет смысл сериализовать блокировку? –

2

Javadoc для ReentrantLock в JDK 1.5 государства явно что:

* 
* <p>Serialization of this class behaves in the same way as built-in 
* locks: a deserialized lock is in the unlocked state, regardless of 
* its state when serialized. 
Смежные вопросы