多线程的调试是很麻烦的事情。 主要的原因是多线程的执行存在着无序性。
现在通过java中的信号量举一个例子说明。
Java中的信号量是用来控制多个线程对一个共享资源的并发访问时,并发访问的线程的数量的。
通过实验发现,在java 执行器的线程池中执行时,调试时候的执行结果和实际运行时的运行结果存在着不一致的情况。
通过在主线程中的一个for循环,向线程池提交20个执行任务的时候,如果通过断点调试,发现先被添加到线程池中的线程先获得执行机会,后面阻塞等待信号量的线程也是先加入线程池的优先获得信号量。但是在执行的时候,实际情况则是乱序的。
主要的原因是因为执行的时候没有设置断点,住线程中的for循环在瞬间完成,也就是说机会在同一时刻向线程池中提交了20个执行任务,然后线程池会为这20个执行任务分配线程,然后挑出前5个线程执行。 等这5个线程中的一个执行完成以后,会按照一定的策略从剩下的线程中挑出一个来执行。