Если это только для целей тестирования / отладки, вы можете сделать это следующим образом:
Если это еще не так, выставьте логическое значение через геттер и посчитайте количество потоков в геттере. Вот простой пример, где я делаю список всех потоков, обращающихся к геттеру:
class MyClass {
private boolean myAttribute = false;
private Set<String> threads = new HashSet<>();
public Set<String> getThreadsSet() {
return threads;
}
public boolean isMyAttribute() {
synchronized (threads) {
threads.add(Thread.currentThread().getName());
}
return myAttribute;
}
}
Тогда вы можете проверить
MyClass c = new MyClass();
Runnable runnable = c::isMyAttribute;
Thread thread1 = new Thread(runnable, "t1");
Thread thread2 = new Thread(runnable, "t2");
Thread thread3 = new Thread(runnable, "t3");
thread1.start();
thread2.start();
thread3.start();
thread1.join();
thread2.join();
thread3.join();
System.out.println(c.getThreadsSet());
Это выводит:
[t1, t2, t3]
EDIT:
Только что увидел, что вы добавили, что к атрибуту обращаются через сеттер, вы можете адаптировать решение и регистрировать потоки в сеттере