Jlint will check your Java code and find bugs, inconsistencies and synchronization problems by doing data flow analysis and building lock graph. Jlint consists of AntiC, fixing problems with C grammar, which can cause dangerous programmer's bugs, undetected by compiler, and Semantic verifier Jlint, which extracts information from Java class files. Jlint performs local and global data flow analyses, calculating possible values of local variables and catching redundant and suspicious calculations. Except deadlocks, Jlint is able to detect possible race condition problem, when different threads can concurrently access the same variables.
Jlint uses smart approach to message reporting. All messages are grouped in categories, and it is possible to enable or disable reporting messages of specific category as well as concrete messages. Jlint can remember reported messages and do not report them once again when you run Jlint second time.