Как мне правильно недействительно и ясно в кэше кофеинаJAVA

Программисты JAVA общаются здесь
Anonymous
Как мне правильно недействительно и ясно в кэше кофеина

Сообщение Anonymous »

Я изо всех сил пытаюсь правильно аннулировать кэш. < /p>
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;

import java.util.*;
import java.util.concurrent.locks.ReentrantLock;

class Trial2 {
public static void main(String[] args) {
LoadingCache cache = Caffeine.newBuilder()
.maximumSize(5)
.removalListener( (key, value, cause) -> {
try {
((AutoCloseable) value).close();
} catch (Exception e) {
throw new RuntimeException(e);
}
})
.build(Trial2::getObj);

Random random = new Random();
for (int i = 0; i < 1000000; i++) {
int value = random.nextInt(1000);
var found = cache.get(value);
if (found.isClosed) {
cache.invalidate(value);
cache.cleanUp();
found = cache.get(value);
}
if (found.getValue() != value) {
throw new IllegalStateException("Value mismatch: expected " + value + ", got " + found.getValue());
}
}
System.out.println("All values matched successfully!");
}

private static Temp getObj(int value) {
System.out.println("Creating obj for value: " + value);
return new Temp(value);
}
}

class Temp implements AutoCloseable {
private final int value;
public volatile boolean isClosed = false;
private ReentrantLock lock = new ReentrantLock();

public Temp(int value) {
this.value = value;
}

public int getValue() {
lock.lock();
try {
if (isClosed) {
throw new IllegalStateException("This object is closed");
}
return value;
}finally {
lock.unlock();
}
}

@Override
public void close() throws Exception {
lock.lock();
try {
System.out.println("Closing class with value: " + value);
isClosed = true;
} finally {
lock.unlock();
}
}
}
< /code>
Я даже попробовал < /p>
if (found.isClosed) {
cache.asMap().remove(value);
found = cache.get(value);
}
< /code>
все еще < /p>
Exception in thread "main" java.lang.IllegalStateException: This object is closed
at Temp.getValue(idk.java:57)
at Trial2.main(idk.java:31)
< /code>
Я планировал использовать кэш и в многопоточной среде. это связано с тем, что объект является состоящим?

Подробнее здесь: https://stackoverflow.com/questions/797 ... eine-cache

Вернуться в «JAVA»