Есть ли способ подсчета доступа потоков к примитивной переменной? - PullRequest
2 голосов
/ 11 июня 2019

У меня есть переменная в моем коде, простой примитивный логический x.Из-за сложности кода я не уверен в количестве потоков, обращающихся к нему.Может быть, он никогда не передается или используется только одним потоком, а может и нет.Если он разделен между потоками, мне нужно использовать AtomicBoolean.

Есть ли способ подсчета потоков, обращающихся к логическому x?

До сих пор я делал обзор кода, но он очень сложный и не написан мной.

Ответы [ 2 ]

3 голосов
/ 11 июня 2019

Если это только для целей тестирования / отладки, вы можете сделать это следующим образом:

Если это еще не так, выставьте логическое значение через геттер и посчитайте количество потоков в геттере. Вот простой пример, где я делаю список всех потоков, обращающихся к геттеру:

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: Только что увидел, что вы добавили, что к атрибуту обращаются через сеттер, вы можете адаптировать решение и регистрировать потоки в сеттере

0 голосов
/ 18 июня 2019

Всегда обращайтесь к переменной с помощью получателя и записывайте логику для получения идентификатора потока всякий раз, когда новый поток пытается получить примитивное значение.всякий раз, когда поток завершается, используйте shutdown hook, чтобы удалить этот threadId из этого списка.Список будет содержать идентификаторы всех потоков, в настоящее время содержащих ссылку на эту переменную.

 getVar(){
countLogic();
return var;}

countLogic(){
if(!list.contains(Thread.getCurrentThread().getId)){
list.add(Thread.getCurrentThread().getId);
Runtime.getRuntime().addShutdownHook(//logic to remove thread id from the list);
}

Надеюсь, это поможет

...