Masterfield

A Masterfield Oktatóközpont szakmai blogja. Minden, ami a tanfolyamokról kimaradt

Friss topikok

  • gyuria: Na végre, már nagyon vártam Már annyi téma összejött, hogy egy jó darabig biztos kitart :) (2008.10.24. 08:04) Elindultunk

Linkblog

Java holtpont vizsgálata thread dump segítségével - 2. rész

2008.09.17. 12:40 | gbujdoso | Szólj hozzá!

Címkék: java collection jvm stack thread holtpont dump masterfield thread dump hashtable deadlock util

Nézzük a dumpból a stack-et (az aktuális végrehajtási láncot):

Java stack information for the threads listed above:

===================================================

"Thread-1":

        at java.util.Hashtable.size(Hashtable.java:206)

        - waiting to lock <0x24100158> (a java.util.Hashtable)

        at java.util.Hashtable.equals(Hashtable.java:742)

        - locked <0x24100180> (a java.util.Hashtable)

        at Bug$1.run(Bug.java:16)

        at java.lang.Thread.run(Thread.java:619)

"Thread-0":

        at java.util.Hashtable.get(Hashtable.java:333)

        - waiting to lock <0x24100180> (a java.util.Hashtable)

        at java.util.Hashtable.equals(Hashtable.java:755)

        - locked <0x24100158> (a java.util.Hashtable)

        at Bug$1.run(Bug.java:16)

        at java.lang.Thread.run(Thread.java:619)

 

A példa kódban a kiemelt résznél, a h1.equals(h2) utasításnál van a holtpont. Itt még a külön jelőlt két szál ugyanazt az utasítást (equals) hajtja végre.

 

Mit is csinál itt az equals az API leírás szerint? http://java.sun.com/javase/6/docs/api/java/util/Hashtable.html#equals(java.lang.Object)

 

Compares the specified Object with this Map for equality, as per the definition in the Map interface.

Ez átküld minket a Map inteface equals leírásához.

Nézzük meg azt is:

http://java.sun.com/javase/6/docs/api/java/util/Map.html#equals(java.lang.Object)

 

boolean equals(Object o)

Compares the specified object with this map for equality. Returns true if the given object is also a map and the two maps represent the same mappings. More formally, two maps m1 and m2 represent the same mappings if m1.entrySet().equals(m2.entrySet()). This ensures that the equals method works properly across different implementations of the Map interface.

 

 

A J2SE 6-os verziójának forráskódja innen tölthető le:

http://download.java.net/jdk6/6u3/promoted/b05/index.html

 

Ebben megkeressük a Hashtable.equals Sun-os megvalósítását:

/**

 * Compares the specified Object with this Map for equality,

 * as per the definition in the Map interface.

 *

 * @param  o object to be compared for equality with this hashtable

 * @return true if the specified Object is equal to this Map

 * @see Map#equals(Object)

 * @since 1.2

 */

public synchronized boolean equals(Object o) {

if (o == this)

    return true;

 

if (!(o instanceof Map))

    return false;

Map<K,V> t = (Map<K,V>) o;

if (t.size() != size())

    return false;

 

    try {

        Iterator<Map.Entry<K,V>> i = entrySet().iterator();

        while (i.hasNext()) {

            Map.Entry<K,V> e = i.next();

            K key = e.getKey();

            V value = e.getValue();

            if (value == null) {

                if (!(t.get(key)==null && t.containsKey(key)))

                    return false;

            } else {

                if (!value.equals(t.get(key)))

                    return false;

            }

        }

    } catch (ClassCastException unused)   {

        return false;

    } catch (NullPointerException unused) {

        return false;

    }

 

return true;

}

 

Ahogy az API leírásban szerepel itt egy ciklusban összehasonlítja a Hashtable elemeit. Akkor tekinti egyezőnek a két hash táblát, ha pontosan csak ugyanazokat az elemeket tartalmazzák.

 

Nézzük tovább a stack-et és hatoljunk mélyebbre a „gyári” Java kódban:

Java stack information for the threads listed above:

===================================================

"Thread-1":

        at java.util.Hashtable.size(Hashtable.java:206)

        - waiting to lock <0x24100158> (a java.util.Hashtable)

        at java.util.Hashtable.equals(Hashtable.java:742)

        - locked <0x24100180> (a java.util.Hashtable)

        at Bug$1.run(Bug.java:16)

        at java.lang.Thread.run(Thread.java:619)

"Thread-0":

        at java.util.Hashtable.get(Hashtable.java:333)

        - waiting to lock <0x24100180> (a java.util.Hashtable)

        at java.util.Hashtable.equals(Hashtable.java:755)

        - locked <0x24100158> (a java.util.Hashtable)

        at Bug$1.run(Bug.java:16)

        at java.lang.Thread.run(Thread.java:619)

 

 

Tehát a Java forrásból ez a 742-es és 755-ös sorok érdekesek:

 

public synchronized boolean equals(Object o) {

if (o == this)

    return true;

 

if (!(o instanceof Map))

    return false;

Map<K,V> t = (Map<K,V>) o;

if (t.size() != size())

    return false;

 

    try {

        Iterator<Map.Entry<K,V>> i = entrySet().iterator();

        while (i.hasNext()) {

            Map.Entry<K,V> e = i.next();

            K key = e.getKey();

            V value = e.getValue();

            if (value == null) {

                if (!(t.get(key)==null && t.containsKey(key)))

                    return false;

            } else {

                if (!value.equals(t.get(key)))

                    return false;

            }

        }

    } catch (ClassCastException unused)   {

        return false;

    } catch (NullPointerException unused) {

        return false;

    }

 

return true;

}

 

A bejegyzés trackback címe:

https://masterfield.blog.hu/api/trackback/id/tr37745331

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása