Description
With more than 6 threads, the API PDFOperator#getOperator(String operator) is still blocked :
Sample with 48 threads :
pool-1-thread-46" - Thread t@72
java.lang.Thread.State: RUNNABLE
at org.apache.pdfbox.util.PDFOperator.getOperator(PDFOperator.java:76)
at org.apache.pdfbox.pdfparser.PDFStreamParser.parseNextToken(PDFStreamParser.java:441)
at org.apache.pdfbox.pdfparser.PDFStreamParser.access$000(PDFStreamParser.java:46)
at org.apache.pdfbox.pdfparser.PDFStreamParser$1.tryNext(PDFStreamParser.java:175)
at org.apache.pdfbox.pdfparser.PDFStreamParser$1.hasNext(PDFStreamParser.java:187)
at org.apache.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:266)
I propose to remove the synchronization of the attribute "operators" and set up a synchronization
on the put operation. (This optimization saves 30 percent of time)
public class PDFOperator
{
[...]
// private static Map operators = Collections.synchronizedMap( new HashMap() );
private static Map operators = new HashMap();
[...]
public static PDFOperator getOperator( String operator )
{
PDFOperator operation = null;
if( operator.equals( "ID" ) || operator.equals( "BI" ) )
else
{
operation = (PDFOperator)operators.get(operator);
if( operation == null )
{
synchronized (operators) {
operation = (PDFOperator)operators.get(operator);
if ( operation == null )
}
}
}
return operation;
}
[...]
}