代码之家  ›  专栏  ›  技术社区  ›  Ulrich Scholz

获取并发访问的所有线程的堆栈跟踪:

  •  0
  • Ulrich Scholz  · 技术社区  · 6 年前

    我们似乎可以同时访问代码中的一个方法。解决方法是同步该方法。但这并不能解决根本原因:首先不应该有这种并发访问。

    另一个选择是检测同步是否会阻塞-在它实际阻塞之前。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Akshay Paliwal    6 年前

    试着使用可重入锁来适应这个目的。以下是示例代码:

    private final ReentrantLock lock = new ReentrantLock();
    
          public void sampleLock() {
            lock.lock();
            try {
              Thread.sleep(5000);
            } catch (InterruptedException e) {
              System.out.println(Thread.currentThread().getName() + "interrupted");
            }
            lock.unlock();
          }
    

    如果任何其他方法想要访问 sampleLock() 那么方法呢 lock.isLocked() 请查阅Oracle文档以获取相同的信息。 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html

        2
  •  0
  •   Michael P    6 年前

    这里为您提供了一些选择。

    基本代码是

        Lock lock = new ReentrantLock();
    
        if(!lock.tryLock()) {
            Map<Thread, StackTraceElement[]> threads = Thread.getAllStackTraces();
        }
        try {
            ///your code
        }
        finally {
            lock.unlock();
        }
    

    Map<Thread, StackTraceElement[]> threads = Thread.getAllStackTraces();
    

    行,它将暂停所有线程。然后您可以在该映射中看到所有线程及其堆栈跟踪

    如果无法附加调试器,则只需在该映射上迭代并获取所有堆栈跟踪。

    不使用锁的另一种方法是:

    private Set<Thread> threads = new HashSet<>();
    
    public void yourMethodInQuestion() {
        threads.add(Thread.currentThread());
        if( threads.size() >= 2 ) {
            //iterate and get all the threads information
        }
        ....
    }
    

    我希望这有帮助。

    迈克尔, Java多线程、并发和性能优化 课程

    https://www.udemy.com/java-multithreading-concurrency-performance-optimization/?couponCode=CONCURRENCY