Một cá thể Jedis không phải là luồng an toàn vì nó được triển khai theo cách này. Đó là quyết định mà tác giả của thư viện đã đưa ra.
Bạn có thể kiểm tra mã nguồn của BinaryJedis, một loại siêu Jedis https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/BinaryJedis.java
Ví dụ những dòng sau:
public Transaction multi() {
client.multi();
client.getOne(); // expected OK
transaction = new Transaction(client);
return transaction;
}
Như bạn có thể thấy trường giao dịch được chia sẻ cho tất cả các luồng bằng cá thể Jedis và được khởi tạo trong phương thức này. Sau đó, giao dịch này có thể được sử dụng trong các phương thức khác. Hãy tưởng tượng hai luồng thực hiện các hoạt động giao dịch cùng một lúc. Kết quả có thể là một giao dịch được tạo bởi một luồng được một luồng khác vô tình truy cập. Trường giao dịch trong trường hợp này là quyền truy cập trạng thái được chia sẻ mà không được đồng bộ hóa. Điều này làm cho Jedis không phải là chuỗi an toàn.
Lý do tại sao tác giả quyết định làm cho Jedis non-threadsafe và JedisPool threadsafe có thể là để cung cấp tính linh hoạt cho các máy khách để nếu bạn có môi trường đơn luồng, bạn có thể sử dụng Jedis và có được hiệu suất tốt hơn hoặc nếu bạn có môi trường đa luồng, bạn có thể sử dụng JedisPool và có được sự an toàn của chuỗi.