私は、デバッグ(Shiftキー+ F9)メソッドだoffer(E e)
JDK8 APIののjava.util.concurrent.ConcurrentLinkedQueue
、
私はのIntelliJ IDEAは、フィールドに変更します見つけhead
、デバッグの過程でsoundlesslyこのキューのを、
しかし、実行スキーマ(Shiftキー+ F10は)なぜ、フィールドを変更しないのだろうか?
そして何のコードはこのフィールドを変更していないがありますoffer(E e)
、それは私が混乱になり、。
その後、私は別のIDE(EclipseのMars.1リリース(4.5.1))、それはこのような問題を持っていないを試してみました。
私のテストのいくつかの結果があります。
- 実行スキーマ(Shiftキー+ F10)
head: 1159190947
head: 1159190947
head: 1159190947
head: 1159190947
- デバッグスキーマ(ステップオーバー:F8)
head: 1989972246
head: 1791930789
head: 1791930789
head: 1791930789
- デバッグスキーマ(再開プログラム:F9)
head: 1989972246
head: 1989972246
head: 1791930789
head: 1791930789
バージョン情報:
のIntelliJ IDEA 2018.1(アルティメットエディション)
ビルド#IU-181.4203.550、2018年3月27日上に構築された
JRE:1.8.0_162-B12 AMD64
JVM:は、Java HotSpot(TM)64ビットサーバーVMのOracleによる社
のWindows 10 10.0
そして、のIntelliJ IDEA 2018年2月3日(コミュニティ版)&のIntelliJ IDEA 2019.1(アルティメットエディション)は、同じ問題を抱えています。
import java.lang.reflect.Field;
import java.util.concurrent.ConcurrentLinkedQueue;
public class ConcurrentLinkedQueueTest {
public static void main(String[] args) {
ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
print(queue);
queue.offer("aaa");
print(queue);
queue.offer("bbb");
print(queue);
queue.offer("ccc");
print(queue);
}
/**
* 打印并发队列head属性的identityHashCode
* @param queue
*/
private static void print(ConcurrentLinkedQueue queue) {
Field field = null;
boolean isAccessible = false;
try {
field = ConcurrentLinkedQueue.class.getDeclaredField("head");
isAccessible = field.isAccessible();
if (!isAccessible) {
field.setAccessible(true);
}
System.out.println("head: " + System.identityHashCode(field.get(queue)));
} catch (Exception e) {
e.printStackTrace();
} finally {
field.setAccessible(isAccessible);
}
}
}
デフォルトでは、IntelliJ IDEAが起動するtoString()
腕時計ビューでのプレゼンテーションを得るために、オブジェクトのメソッドを。でConcurrentLinkedQueue
、toString()
更新することができますコレクションの方法を反復し、head
ViaフィールドのupdateHead()
中の呼び出しfirst()
方法(そしておそらく他の場所で、私は、全体の実装を検討していません。
あなたは環境設定に行けば| ビルド、実行、展開| デバッガ| データビュー| Javaとオフには「のtoString()オブジェクト・ビューを有効にする」、あなたはもう、この動作を観察するべきではありません。