Re: Singleton vs static
Philipp wrote:
Lew wrote:
Philipp wrote:
Lew wrote:
Philipp wrote:
My POV: No, you can put a state in a static var and access it
through static methods.
Which breaks as soon as two different instances need different state
at the same time.
If you need _two_ instances its not a singleton anymore, is it?
Two different *client* instances, duhy!
OK sorry. I don't understand.
Do you mean I have to synchronize the access to the static var?
Synchronization won't help. The problem generally is the problem with global
variables.
<sscce source="testit/SnoGlobal.java" >
package testit;
import java.util.Random;
class Foo
{
volatile private static String global;
public static void setGlobal( String g )
{ global = g; }
public static String getGlobal()
{ return global; }
}
/** SnoGlobal - The answer to "What's a good global?"
*/
public class SnoGlobal implements Runnable
{
private final String name;
public SnoGlobal( String f )
{
this.name = f;
}
@Override
public void run()
{
Random ran = new Random();
for ( int ix = 0; ix < 3; ++ix)
{
Foo.setGlobal( name );
try
{
Thread.sleep( ran.nextInt( 5000 ) );
}
catch ( InterruptedException ex )
{
System.err.println( "Interrupted "+ name );
}
System.out.println( "Instance " + name + ", global " +
Foo.getGlobal() );
}
}
public static void main( String [] args )
{
SnoGlobal baron = new SnoGlobal( "baron" );
SnoGlobal tobar = new SnoGlobal( "tobar" );
new Thread( baron ).start();
new Thread( tobar ).start();
}
}
</sscce>
Output:
Instance tobar, global tobar
Instance baron, global tobar
Instance tobar, global baron
Instance tobar, global tobar
Instance baron, global tobar
Instance baron, global baron
--
Lew