Hi,
Have you considered switching to java.time.format.DateTimeFormatter
<https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/time/format/package-summary.html>?
If you are going to have to change the callsites, you can use a faster
and more modern API at the same time.
Regards, Roger
On 9/27/22 4:47 PM, Attila Szegedi wrote:
Hey folks,
I’ve been looking at some performance bottlenecks in a system recently, and
found that we have some that stem from synchronizing on a SimpleDateFormat
(which, as we know, isn’t thread safe.) This got me thinking about switching to
a ThreadLocal of them, but I realized that I don’t need one for each thread,
just enough otherwise identical instances to avoid contention.
That further made me think of how it’d be nice to have a class that can
instantiate a requisite number of identical instances of a non-threadsafe
class, and provide locked access to a consumer I pass to it, internally
managing the contention in a similar way to how e.g. LongAccumulator does (or
rather, the Striped64 class underlying it), including all the appreciable
details that went into that logic such as advancing the Threads'
threadLocalRandomProbe to slowly converge on a perfect hash function etc.
So it’s essentially an object pool somewhere between a ThreadLocal and Striped64. I
don’t have a good name for it; “WeakThreadLocal” or “ThreadRental” come to mind as
it’d allow threads to essentially “rent" these objects :-) Its API would
roughly be:
public final class WeakThreadLocal<T> {
public WeakThreadLocal(Supplier<T> newInstance);
public void use(Consumer<T> user);
}
and then I could do:
var dateFormats = new WeakThreadLocal(
// invoked to create instances as contention dictates
()=>new SimpleDateFormat(…)
);
…
dateFormats.use(dateFormat => … while this runs, only this thread has access to
this dateFormat)
Is there anything obviously wrong/hard with this idea? (Aside from the
admittedly material problem where the pooled class should itself take care
against false sharing.) How useful would a class like this be in general?
Thanks for any insights,
Attila.