Java synchronized method around parameter value

前端 未结 2 1583
梦毁少年i
梦毁少年i 2021-01-06 01:57

Consider the following method:

public void upsert(int customerId, int somethingElse) {
  // some code which is prone to race conditions    
}
2条回答
  •  悲&欢浪女
    2021-01-06 02:16

    The concept you're looking for is called segmented locking or striped locking. It is too wasteful to have a separate lock for each customer (locks are quite heavyweight). Instead you want to partition your customer ID space into a reasonable number of partitions, matching the desired degree of parallelism. Typically 8-16 would be enough, but this depends on the amount of work the method does.

    This outlines a simple approach:

    private final Object[] locks = new Object[8];
    
    synchronized (locks[customerId % locks.length]) {
        ...implementation...
    }
    

提交回复
热议问题