In Cats-effect, when is xxx inside IO.pure(xxx) executed?

It’s said IO.pure() means eager evaluation. But it doesn’t seem to so in this example: Here println(“print in pure”) is executed just like as if it’s IO.apply() Another example, however, discloses the truth Here is it how it works: When printTwice() is called, every expression inside it is evaluated IO.apply(println(“print in lazy”)) is evaluated as …

In Cats-effect, when is xxx inside IO.pure(xxx) executed? Read More »

Please catch Throwable in a task submitted to a thread pool

Exceptions thrown in a task submitted to a thread pool will just disappear. You won’t even see the log. You can catch java.lang.Exception and handle it. But to make things even better, please catch java.lang.Throwable instead. In theory, it’s not recommended to catch a Throwable. But to be pragmatic, it’s important for you to see …

Please catch Throwable in a task submitted to a thread pool Read More »

Condition variable related code is hard to understand. So let me explain

There are a few strange things about Condition related code in Java concurrency. I’ll use the following code to show you. The code is about one cup and two threads. One thread is trying to fill it, the other to drink from it. The code uses explicit Lock + Condition API. But what I’m going …

Condition variable related code is hard to understand. So let me explain Read More »

Test-and-set Primitive

First of all, it’s not the same as “compare-and-swap”. Sounds similar, but different. What it does is, Set a variable to a new value Return the old value of the variable It’s a hardware primitive, i.e. atomic. On x86 the instruction is `xchg` (There is actually no “test” , is there? ) What can it …

Test-and-set Primitive Read More »

Lock striping vs Lock splitting

Lock stripping: Use different locks for different purposes on the whole data structure. For example, a read lock + a write lock Lock splitting: Use multiple locks for different parts of a data structure. For example, 16 locks are used for a ConcurrentHashMap, each guards N/16 buckets (N = total number of buckets)

Microservice’s independent scaling can improve overall performance. But how, and how much ? – part 3, more discussion

Caveats of “they perform the same” As you can see in the previous 2 articles (part1 and part2), distributed mode and bundled mode sometimes have the same performance. However, most of “the same performance” scenarios are based on this assumption: For a single service if the computer hardware is twice as good, then the performance …

Microservice’s independent scaling can improve overall performance. But how, and how much ? – part 3, more discussion Read More »