I guess double-checked locking works here because all the fields you set in the constructor are final anyway, but it still looks a bit weird without the transactionState being volatile... could you add a comment about it?