【问题标题】:Monitor lock in RuleBasedCollator?监视 RuleBasedCollat​​or 中的锁定?
【发布时间】:2016-02-12 21:16:00
【问题描述】:

好的,所以我试图找出为什么某些线程代码会成为瓶颈,并查看线程转储,似乎 java.text.RuleBasedCollat​​or.compare 正在锁定 RuleBasedCollat​​or 对象。

但是,我查看that code,并没有同步的代码部分可以设置此监视器锁定代码。据我所知,Java 中获取锁的唯一方法是在一段同步代码中。下面我包含了 1) 拥有锁的线程和 2) 正在等待它的线程的堆栈转储。如果您需要更多信息,请告诉我。

线程锁定:

Owns Monitor Lock on 0xc6f85460
Java Stack
at sun.text.normalizer.ReplaceableUCharacterIterator.(ReplaceableUCharacterIterator.java:44) 
at sun.text.normalizer.UCharacterIterator.getInstance(UCharacterIterator.java:66) 
at sun.text.normalizer.NormalizerBase.setText(NormalizerBase.java:985) 
at java.text.CollationElementIterator.setText(CollationElementIterator.java:480) 
at java.text.RuleBasedCollator.compare(RuleBasedCollator.java:353) 
- locked [0xc6f85460] (a java.text.RuleBasedCollator) 
at java.text.Collator.compare(Collator.java:310) 
at java.util.Arrays.binarySearch0(Arrays.java:2105) 
at java.util.Arrays.binarySearch(Arrays.java:2043) 
at org.apache.axis.utils.JavaUtils.isJavaKeyword(JavaUtils.java:740)

线程等待锁:

Waiting for Monitor Lock on 0xc6f85460
Java Stack
at java.text.RuleBasedCollator.compare(RuleBasedCollator.java:343) 
- waiting to lock [0xc6f85460] (a java.text.RuleBasedCollator) 
at java.text.Collator.compare(Collator.java:310) 
at java.util.Arrays.binarySearch0(Arrays.java:2105) 
at java.util.Arrays.binarySearch(Arrays.java:2043) 
at org.apache.axis.utils.JavaUtils.isJavaKeyword(JavaUtils.java:740)

任何见解将不胜感激。

【问题讨论】:

    标签: java multithreading locking


    【解决方案1】:

    你没有说你使用的是什么版本的 Java,但是在 Java 8 中,RuleBasedCollat​​or 中的 compare 方法是同步的:

    public synchronized int compare(String source, String target)
    

    这将解释您所看到的线程转储。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      相关资源
      最近更新 更多