首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iText PDF -线程争用

iText PDF -线程争用
EN

Stack Overflow用户
提问于 2014-12-11 15:25:54
回答 1查看 509关注 0票数 0

我使用的是iTextPDF版本5.4.2,当负载很重时,我会遇到线程争用问题。我正在使用IBM JDK 6

这就是问题所在,当有多个独立的线程试图生成不同的pdf文件时,我在SecureRandom.nextBytes上看到一个争用,因为这是同步的,所有线程都在等待锁定这个对象。下面是线程转储

代码语言:javascript
复制
*"WebContainer : 0" daemon prio=3 tid=0x007ffc00 nid=0x91 waiting for monitor entry [0xc823d000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.security.SecureRandom.nextBytes(SecureRandom.java:433)
    - waiting to lock <0xdf4b7430> (a java.security.SecureRandom)
    at java.util.UUID.randomUUID(UUID.java:162)
    at com.itextpdf.text.pdf.PdfPCell.<init>(PdfPCell.java:123)
    at com.itextpdf.text.pdf.PdfPRow.<init>(PdfPRow.java:136)
    at com.itextpdf.text.pdf.PdfPTable.<init>(PdfPTable.java:260)
    at com.itextpdf.text.pdf.PdfPCell.<init>(PdfPCell.java:251)
    at com.itextpdf.text.pdf.PdfPRow.<init>(PdfPRow.java:136)
    at com.itextpdf.text.pdf.PdfPTable.<init>(PdfPTable.java:260)
    at com.itextpdf.text.pdf.PdfPCell.<init>(PdfPCell.java:251)
    at com.itextpdf.text.pdf.PdfPRow.<init>(PdfPRow.java:136)
    at com.itextpdf.text.pdf.PdfPTable.<init>(PdfPTable.java:260)
    at com.itextpdf.text.pdf.PdfPCell.<init>(PdfPCell.java:251)
    at com.itextpdf.text.pdf.PdfPRow.<init>(PdfPRow.java:136)
    at com.itextpdf.text.pdf.PdfPTable.adjustCellsInRow(PdfPTable.java:1377)
    at com.itextpdf.text.pdf.PdfPTable.getRows(PdfPTable.java:1364)
    at com.itextpdf.text.pdf.ColumnText.goComposite(ColumnText.java:1702)
    at com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:881)
    at com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:876)
    at com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:865)
    at com.itextpdf.text.pdf.PdfDocument.addPTable(PdfDocument.java:2566)
    at com.itextpdf.text.pdf.PdfDocument.add(PdfDocument.java:723)
    at com.itextpdf.text.Document.add(Document.java:278)* 

你能帮我避免这个问题吗?

侧边

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-11 16:14:53

我希望争用不是针对锁,而是针对随机字节。我很难确切地知道您使用的是什么设置,但我怀疑SecureRandom类使用了操作系统提供的(缓慢的)安全随机服务,而且您正在耗尽熵池。当数据耗尽时,读取随机数据的调用将被阻塞,直到有更多的数据可用为止。试图获取随机数据的其他线程将卡在锁上,使其看起来像是锁的问题。

我认为解决这个问题的最简单的方法是升级到最新版本的iTextPdf。在此版本中,ID已从UUID更改为从不阻塞的计数器生成的整数。

如果不能升级,另一个可能的解决方法是更改环境中使用的安全提供程序,以提供安全性较低但速度更快的SecureRandom服务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27426344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档