有没有办法计算访问原始变量的线程数?
Is there a way to count accesing threads to a primitive variable?
我的代码中有一个变量,一个简单的原始布尔值 x。由于代码复杂,我不确定访问它的线程数。也许它永远不会被共享,或者只被一个线程使用,也许不会。如果它在线程之间共享,我需要改用 AtomicBoolean
。
有没有办法对访问布尔值 x 的线程进行计数?
到现在为止我对代码进行了审查,但是它非常复杂而且不是我写的。
如果这只是为了 testing/debugging 目的,您可以这样做:
如果还不是这种情况,请通过 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
中记录线程
始终使用 getter 访问变量并写下每当新线程尝试获取原始值时获取线程 ID 的逻辑。每当线程终止时,使用关闭钩子从该列表中删除该 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);
}
希望对您有所帮助
我的代码中有一个变量,一个简单的原始布尔值 x。由于代码复杂,我不确定访问它的线程数。也许它永远不会被共享,或者只被一个线程使用,也许不会。如果它在线程之间共享,我需要改用 AtomicBoolean
。
有没有办法对访问布尔值 x 的线程进行计数?
到现在为止我对代码进行了审查,但是它非常复杂而且不是我写的。
如果这只是为了 testing/debugging 目的,您可以这样做:
如果还不是这种情况,请通过 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
中记录线程始终使用 getter 访问变量并写下每当新线程尝试获取原始值时获取线程 ID 的逻辑。每当线程终止时,使用关闭钩子从该列表中删除该 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);
}
希望对您有所帮助