有没有办法将访问线程计数到原始变量?

时间:2019-06-11 07:58:54

标签: java multithreading atomicboolean

我的代码中有一个变量,一个简单的原始布尔值x。由于代码复杂,我不确定访问它的线程数。也许从不共享它,或者仅由一个线程使用它,也许没有。如果在线程之间共享它,则需要使用AtomicBoolean

有没有一种方法可以计算访问布尔x的线程?

直到现在我都对代码进行了审查,但是它非常复杂,不是我自己编写的。

2 个答案:

答案 0 :(得分:3)

如果这只是出于测试/调试的目的,则可以这样进行:

如果还不是这种情况,则通过getter公开布尔值并计算getter中的线程。这是一个简单的示例,其中列出了所有访问getter的线程:

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]

编辑: 刚刚看到您添加了通过setter访问该属性的信息,您可以调整解决方案并在setter中记录线程

答案 1 :(得分:0)

每当新线程尝试获取原始值时,始终使用getter访问变量并写下逻辑以获取线程id。每当线程终止时,请使用shutdown钩子从列表中删除该threadId。该列表将包含当前持有对该变量引用的所有线程的ID。

 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);
}

希望有帮助