I use following code for guarantee startTime
variable set once only:
public class Processor
{
private Date startTime;
public void doProcess()
{
if(startTime == null)
synchronized(this)
{
if(startTime == null)
{
startTime = new Date();
}
}
// do somethings
}
}
I will guarantee by this code for variable instantiated once only for any number of invoking process
method call.
My question is:
Is there alternative approach for my code be more concise? (for sample remove if
& synchronized
statements)
Based on you comments, you could use AtomicReference
firstStartTime.compareAndSet(null, new Date());
or AtomicLong
firstStartTime.compareAndSet(0L, System.currentTimeMillis());
I would use
private final Date startTime = new Date();
or
private final long startTime = System.currentTimeMillis();
Use AtomicReference:
public class Processor {
private final AtomicReference<Date> startTime = new AtomicReference<Date>();
public void doProcess() {
if (this.startTime.compareAndSet(null, new Date())) {
// do something first time only
}
// do somethings
}
}
Your code is an example of so called "double check locking." Please read this article. It explains why this trick does not work in java although it is very smart.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With