T
Timo Nentwig
Hi!
Am I right that I can (read-only) access an object *while* it is serialized?
If so, only the serialization needs to be synchronized?
I wrote a little test app:
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.ibjectOutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Test
{
private static class Blah extends Thread
{
private Map m;
public Blah( final Map m )
{
this.m = m;
}
public void run()
{
System.out.println( "start." );
for( final Iterator it = m.keySet().iterator(); it.hasNext(); )
it.next();
System.out.println( "done." );
}
}
public static void main( String[] args )
{
final int size = 1000000;
final Map m = new HashMap( size );
for( int i = 0; i < size; i++ ) m.put( printable( (int
(Math.random() * 10d) ), printable( (int)(Math.random() * 20d) ) );
System.out.println( "initialized." );
try
{
long t = -System.currentTimeMillis();
Blah thread = new Blah( m );
thread.start();
serialize( m, new File( "/tmp/test" ) );
System.out.println( (t += System.currentTimeMillis()) );
}
catch( IOException e )
{
System.err.println( e );
}
}
private static synchronized final void serialize( final Object o, final
File f ) throws IOException
{
final ObjectOutputStream serializer = new ObjectOutputStream( new
BufferedOutputStream( new FileOutputStream( f ) ) );
serializer.writeObject( o );
serializer.flush();
serializer.close();
}
private static final String printable( final int length )
{
final StringBuffer buf = new StringBuffer( length );
for( int i = 0; i < length; i++ )
// buf.append( (char)(32 | 1 + (int)(Math.random() * 125)) ); //
incl. space
buf.append( (char)((32 | 1 + (int)(Math.random() * 124)) + 1) );
return buf.toString();
}
private static final String rndstr( final int length )
{
final StringBuffer buf = new StringBuffer( length );
for( int i = 0; i < length; i++ ) buf.append( (char)(((Math.random()
< 0.5d) ? 64 : 96) | 1 + (int)(Math.random() * 26)) );
return buf.toString();
}
}
Am I right that I can (read-only) access an object *while* it is serialized?
If so, only the serialization needs to be synchronized?
I wrote a little test app:
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.ibjectOutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Test
{
private static class Blah extends Thread
{
private Map m;
public Blah( final Map m )
{
this.m = m;
}
public void run()
{
System.out.println( "start." );
for( final Iterator it = m.keySet().iterator(); it.hasNext(); )
it.next();
System.out.println( "done." );
}
}
public static void main( String[] args )
{
final int size = 1000000;
final Map m = new HashMap( size );
for( int i = 0; i < size; i++ ) m.put( printable( (int
(Math.random() * 10d) ), printable( (int)(Math.random() * 20d) ) );
System.out.println( "initialized." );
try
{
long t = -System.currentTimeMillis();
Blah thread = new Blah( m );
thread.start();
serialize( m, new File( "/tmp/test" ) );
System.out.println( (t += System.currentTimeMillis()) );
}
catch( IOException e )
{
System.err.println( e );
}
}
private static synchronized final void serialize( final Object o, final
File f ) throws IOException
{
final ObjectOutputStream serializer = new ObjectOutputStream( new
BufferedOutputStream( new FileOutputStream( f ) ) );
serializer.writeObject( o );
serializer.flush();
serializer.close();
}
private static final String printable( final int length )
{
final StringBuffer buf = new StringBuffer( length );
for( int i = 0; i < length; i++ )
// buf.append( (char)(32 | 1 + (int)(Math.random() * 125)) ); //
incl. space
buf.append( (char)((32 | 1 + (int)(Math.random() * 124)) + 1) );
return buf.toString();
}
private static final String rndstr( final int length )
{
final StringBuffer buf = new StringBuffer( length );
for( int i = 0; i < length; i++ ) buf.append( (char)(((Math.random()
< 0.5d) ? 64 : 96) | 1 + (int)(Math.random() * 26)) );
return buf.toString();
}
}