Buggy code:
public class LoggingEvent implements Serializable { private static long startTime = System . currentTimeMillis ( ) ; static final long serialVersionUID = - 868428216207166145L ; static final Integer [ ] PARAM_ARRAY = new Integer [ 1 ] ; static final String TO_LEVEL = "toLevel" ; static final Class [ ] TO_LEVEL_PARAMS = new Class [ ] { int . class } ; static final Hashtable methodCache = new Hashtable ( 3 ) ; public final transient String fqnOfCategoryClass ; private transient Category logger ; public final String categoryName ; public transient Priority level ; private String ndc ; private Hashtable mdcCopy ; private Hashtable properties ; private boolean ndcLookupRequired = true ; private boolean mdcCopyLookupRequired = true ; private transient Object message ; private String renderedMessage ; private String threadName ; private ThrowableInformation throwableInfo ; public final long timeStamp ; private LocationInfo locationInfo ; public LoggingEvent ( String fqnOfCategoryClass , Category logger , Priority priority , Object message , Throwable throwable ) { } public LoggingEvent ( String fqnOfCategoryClass , Category logger , long timeStamp , Priority priority , Object message , Throwable throwable ) { } public LoggingEvent ( String fqnOfCategoryClass , Category logger , long timeStamp , Priority priority , String threadName , Object message , String ndc , Hashtable mdc , String [ ] throwableStrRep , LocationInfo li , Hashtable properties ) { } public boolean equals ( Object rObject ) { if ( ( this ) == rObject ) { return true ; } if ( ! ( rObject instanceof LoggingEvent ) ) { return false ; } LoggingEvent rEvent = ( ( LoggingEvent ) ( rObject ) ) ; if ( ( timeStamp ) != ( rEvent . timeStamp ) ) { return false ; } if ( ( level ) != ( rEvent . level ) ) { return false ; } <START_BUG> if ( ! ( threadName . equals ( rEvent . threadName ) ) ) { <END_BUG> return false ; } if ( ( message ) == null ) { if ( ( rEvent . message ) != null ) { return false ; } } else if ( ! ( message . equals ( rEvent . message ) ) ) { return false ; } if ( ( properties ) == null ) { if ( ( rEvent . message ) != null ) { return false ; } } else if ( ! ( properties . equals ( rEvent . properties ) ) ) { return false ; } if ( ( mdcCopy ) == null ) { if ( ( rEvent . mdcCopy ) != null ) { return false ; } } else if ( ! ( mdcCopy . equals ( rEvent . mdcCopy ) ) ) { return false ; } if ( ( ndc ) == null ) { if ( ( rEvent . ndc ) != null ) { return false ; } } else if ( ! ( ndc . equals ( rEvent . ndc ) ) ) { return false ; } if ( ( throwableInfo ) == null ) { if ( ( rEvent . throwableInfo ) != null ) { return false ; } } else if ( ! ( throwableInfo . equals ( rEvent . throwableInfo ) ) ) { return false ; } if ( ( locationInfo ) == null ) { if ( ( rEvent . locationInfo ) != null ) { return false ; } } else if ( ! ( locationInfo . equals ( rEvent . locationInfo ) ) ) { return false ; } return true ; } public int hashCode ( ) { } public boolean locationInformationExists ( ) { } public LocationInfo getLocationInformation ( ) { } public Level getLevel ( ) { } public String getLoggerName ( ) { } public Object getMessage ( ) { } public String getNDC ( ) { } public Object getMDC ( String key ) { } public Set getMDCKeySet ( ) { } public void getMDCCopy ( ) { } public String getProperty ( String key ) { } public Set getPropertyKeySet ( ) { } public String getRenderedMessage ( ) { } public static long getStartTime ( ) { } public String getThreadName ( ) { } public ThrowableInformation getThrowableInformation ( ) { } public String [ ] getThrowableStrRep ( ) { } private void readLevel ( ObjectInputStream ois ) throws IOException , ClassNotFoundException { } private void readObject ( ObjectInputStream ois ) throws IOException , ClassNotFoundException { } public void setProperty ( String key , String value ) { } private void writeObject ( ObjectOutputStream oos ) throws IOException { } private void writeLevel ( ObjectOutputStream oos ) throws IOException { } }

Fix:
if ( ! ( getThreadName ( ) . equals ( rEvent . getThreadName ( ) ) ) ) {