Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有一种方法可以计算访问基元变量的线程数?_Java_Multithreading_Atomicboolean - Fatal编程技术网

Java 有没有一种方法可以计算访问基元变量的线程数?

Java 有没有一种方法可以计算访问基元变量的线程数?,java,multithreading,atomicboolean,Java,Multithreading,Atomicboolean,我的代码中有一个变量,一个简单的原始布尔x。由于代码的复杂性,我不确定访问它的线程数量。也许它从未被共享,或者只被一个线程使用,也许不是。如果它在线程之间共享,我需要使用AtomicBoolean 有没有办法计算访问布尔x的线程数 到目前为止,我对代码进行了审查,但它非常复杂,不是我自己编写的。如果这只是为了测试/调试,您可以这样做: 如果还没有,则通过getter公开布尔值并计算getter中的线程数。下面是一个简单的示例,我列出了访问getter的所有线程: class MyClass {

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

有没有办法计算访问布尔x的线程数


到目前为止,我对代码进行了审查,但它非常复杂,不是我自己编写的。

如果这只是为了测试/调试,您可以这样做:

如果还没有,则通过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;
    }

}
这将产生:

[t1, t2, t3]
编辑:
刚才看到您添加了通过setter访问属性,您可以调整解决方案并在setter中记录线程

始终使用getter访问变量,并在新线程尝试获取原语值时写入逻辑以获取线程id。每当线程终止时,使用shutdownhook从该列表中删除该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);
}

希望有帮助

是直接访问属性,还是它是私有的,由getter访问?到目前为止,您尝试过什么样的评论?您应该能够跟踪实现
Runnable
或从
Thread
继承的所有类,如果这些类中的任何一个访问变量,它可能会被共享。此外,这可能会有所帮助:@bracco23有一些PropertyChangeListener正在访问它。这些类中没有一个实现Runnable或扩展Thread类。@Bentaye是私有的,由setter访问
 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);
}