private Map<CustomerKey, Customer> customerMap = new ConcurrentHashMap<CustomerKey, Customer>();
public Customer getCustomer(CustomerKey customerKey)
{
Customer customer = customerMap.get(customerKey);
if(null == customer)
{
synchronized(this)
{
customer = customerMap.get(customerKey); // Added line
if(null == customer)
{
customer = new Customer();
customerMap.put(customerKey, customer); // Added line
}
}
}
return customer;
}
Так мы обычно делаем блокировку уровня объекта.
В этом примере блокировка уровня объекта применяется независимо от значения объекта customerKey.Таким образом, даже для различных объектов customerKey конкретный блок будет синхронизирован.Я не хочу, чтобы это поведение.
Вместо переменной "this", если я получаю блокировку на объекте customerKey, как показано ниже,
synchronized (customerKey)
Несколько потоков могут передавать разные объекты customerKey, но с одинаковым значением, что означает, что они значимо равны (customerKeyThread1.equals (customerKeyThread2)), но не с одинаковыми объектами (customerKeyThread1! = CustomerKeyThread2)
Таким образом, блокировка объекта customerKeyтакже не является допустимым решением.
Поэтому мне нужна логика, которая обеспечивает синхронизацию для набора кода не только для одного и того же объекта, но и для значимо равных объектов .Как я могу добиться того же?