Redis
 sql >> Database >  >> NoSQL >> Redis

Perché una singola istanza Jedis non è threadsafe?

Una singola istanza Jedis non è threadsafe perché è stata implementata in questo modo. Questa è la decisione presa dall'autore della libreria.

Puoi controllare il codice sorgente di BinaryJedis che è un super tipo di Jedis https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/BinaryJedis.java

Ad esempio queste righe:

public Transaction multi() {
    client.multi();
    client.getOne(); // expected OK
    transaction = new Transaction(client);
    return transaction;
}

Come puoi vedere, il campo della transazione è condiviso per tutti i thread utilizzando l'istanza Jedis e inizializzato in questo metodo. Successivamente questa transazione può essere utilizzata in altri metodi. Immagina che due thread eseguano operazioni transazionali contemporaneamente. Il risultato potrebbe essere che a una transazione creata da un thread si accede involontariamente da un altro thread. Il campo della transazione in questo caso è l'accesso allo stato condiviso a cui non è sincronizzato. Questo rende Jedis non thread-safe.

Il motivo per cui l'autore ha deciso di rendere Jedis non threadsafe e JedisPool threadsafe potrebbe essere quello di fornire flessibilità ai client in modo che se si dispone di un ambiente a thread singolo è possibile utilizzare Jedis e ottenere prestazioni migliori o se si dispone di un ambiente multithread è possibile utilizzare JedisPool e ottieni la sicurezza dei thread.