Установить и обновить concurrenthashmap из нескольких потоков

Я реализую карту поиска клиентов, где использую ConcurrentHashamp.

    private ConcurrentHashMap<String,SignupDTO> map = new <String,SignupDTO> ConcurrentHashMap();*
    public  SignupDTO get(String opcode) 
    {
      return this.map.get(opcode);
    }
    public  void set(String opcode,SignupDTO dto) 
    {
      this.map.put(opcode, dto);
    }

Здесь получите и установите функцию, вызываемую из нескольких потоков, для обновления и получения информации о клиенте. У меня есть другая функция update(), которая вызывается из определенного потока через определенное время и обновляет карту обновленной информацией о клиенте.

public  void update() 
    {
        Connection connection = null;
        Statement stmt = null;
        ResultSet rs = null;

        try 
        {
            connection = DatabaseManager.getInstance().getConnection();
            stmt = connection.createStatement();    
            String sql= "select * from client";
            rs = stmt.executeQuery(sql);
            while (rs.next()) 
            {
                SignupDTO row = new SignupDTO();
                ......
                            ..........
                this.map.put(key, row);         
            }

        } 
    }

операция получения и установки на карте будет потокобезопасной или нет? пожалуйста, помогите мне.


person user2700945    schedule 16.06.2014    source источник
comment
я имею в виду, что операция получения и установки на карте будет потокобезопасной или нет.   -  person user2700945    schedule 16.06.2014
comment
@nosid я имею в виду, что операция получения и установки на карте будет потокобезопасной или нет.   -  person user2700945    schedule 16.06.2014
comment
@nosid не мог понять. Однако отдельные операции в обновлении метода видны до того, как будет выполнен весь метод.   -  person user2700945    schedule 16.06.2014
comment
Представьте, что карта изначально содержит "foo"=1 и "bar"=2. Метод update считывает "foo"=3 и "bar"=4 из базы данных и выполняет обновления. Затем другой поток может прочитать "foo"=3, а затем "bar"=2. Это в принципе самое худшее, что может случиться.   -  person nosid    schedule 16.06.2014
comment
@nosid, я понял твою точку зрения. как я могу избежать этого сценария?   -  person user2700945    schedule 16.06.2014
comment
Во-первых, следует улучшить вопрос: Опишите точнее, что вам нужно и в чем проблема.   -  person nosid    schedule 16.06.2014


Ответы (1)


Как указал @nosid, ваш метод update не будет потокобезопасным (= он может обновить только половину карты, тогда кто-то может прочитать смесь старых/новых значений, а ваш метод обновления завершит обновление другой половины).

Я рекомендую вам поместить результат вашего запроса в карту (не обязательно параллельную) и обновить с помощью putAll из вашего ConcurrentHashMap, который является потокобезопасным (или, по крайней мере, официальная документация может быть такой).

person kajacx    schedule 16.06.2014