JavaRush /Java Blog /Random-TK /Java-da Deadlock näme?
Alexey Smirnov
Dereje
Москва

Java-da Deadlock näme?

Toparda çap edildi
Makala düşünmek üçin zerur bilim derejesi: Java Sintaksis we Java Core gözleglerini tamamladyňyz, indi bolsa Java Multithreading-i öwrenmäge başlaýarsyňyz. Java-da petiklemek ýa-da petiklemek, sapaklaryň jübüt sinhronlaşdyrylan jisimlere aýlawly garaşlylygy ýüze çykanda ýüze çykýan ýalňyşlykdyr. Bir sapak obýektiň monitoryna x, beýlekisi obýekt monitoryna girýär diýip göz öňüne getiriň y. Obýektdäki bir sapak xobýektdäki islendik sinhronlaşdyrylan usuly çagyrmaga synanyşsa ywe obýekt yşol bir wagtyň özünde obýektdäki islendik sinhronlaşdyrylan usuly çagyrmaga synanyşsa x, sapaklar garaşmak bilen ýapyşar. Öçürmek näme?  - 1Aşakda java docs gollanmasyndan gulplama ýaly düşünje barada mysal getirilýär. Bu ýerde sapaklary blokirlemek nirede ýüze çykýar?
public class Deadlock {
    static class Friend {
        private final String name;
        public Friend(String name) {
            this.name = name;
        }
        public String getName() {
            return this.name;
        }
        public synchronized void bow(Friend bower) {
            System.out.format("%s: %s" + "  has bowed to me!%n", this.name, bower.getName());
            bower.bowBack(this);
        }
        public synchronized void bowBack(Friend bower) {
            System.out.format("%s: %s"
                + " has bowed back to me!%n",
                this.name, bower.getName());
        }
    }

    public static void main(String[] args) {
        final Friend alphonse =
            new Friend("Alphonse");
        final Friend gaston =
            new Friend("Gaston");
        new Thread(new Runnable() {
            @Override
            public void run() {
               // System.out.println("Thread 1");
                alphonse.bow(gaston);
               // System.out.println("Th: gaston bowed to alphonse");
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
              //  System.out.println("Thread 2");
                gaston.bow(alphonse);
              //  System.out.println("2.gaston waiting alph bowed");
            }
        }).start();
    }
}
Bu ýerde düşünmeli iki möhüm zat bar:
  1. Bir wagtyň özünde işleýän sapaklaryň her biri takyk näme edýär?
  2. Haýsy gulplar ulanylýar?
Soňundan başlalyň. Synpyň iki obýektini döretdiňiz diýeliň Friend: alphonsewe gaston. Olaryň hersiniň öz gulpy bar. Şeýlelikde, bu gulplaryň ikisi bar: gigolos we gastonlar. Obýektiň sinhronlaşdyrylan usuly girizilende, onuň gulpy gulplanýar we usul çykanda goýberilýär (ýa-da açylýar). Indi sapaklar hakda. Ilkinji sapaga jaň edeliň Alphonse(obýektiň alfonsyndan tapawutlandyrmak üçin baş harp bilen). Ine, näme edýär (geliň A, gysga diýeliň Alphonse):
A: alphonse.bow(gaston) — получает лок alphonse;
A: gaston.bowBack(alphonse) — получает лок gaston;
A: возвращается из обоих методов, тем самым освобождая лок.
Ine, sapak şu wagt näme edýär Gaston:
G: gaston.bow(alphonse) — получает лок gaston;
G: alphonse.bowBack(gaston) — получает лок alphonse;
G: возвращается из обоих методов, тем самым освобождая лок.
Indi bu maglumatlary bir ýere jemläliň we jogap tapalyň. Saplar dürli tertipde biri-biri bilen baglanyşyp biler (ýagny wakalary bolar). Mysal üçin, buýruk aşakdaky ýaly bolsa, petiklener:
A: alphonse.bow(gaston) — получает лок alphonse
G: gaston.bow(alphonse) — получает лок gaston
G: пытается вызвать alphonse.bowBack(gaston), но блокируется, ожидая лока alphonse
A: пытается вызвать gaston.bowBack(alphonse), но блокируется, ожидая лока gaston
Öçürmek näme?  - 2
Bu ýagdaýda iki sapak hem petiklenýär we biri beýlekisiniň gulpy boşatmagyna garaşýar. Emma olaryň hiç biri muny etmez, sebäbi muny etmek üçin usulyny tamamlamaly we başga bir sapak bilen petiklenýär. Şeýdip, bolup geçen ýere ýapyşdylar deadlock. Şeýle-de bolsa, sapaklaryň biriniň ikinjisi başlamazdan ozal tamamlanjak başga bir dokma hem mümkindir:
A: alphonse.bow(gaston) — получает лок alphonse
A: gaston.bowBack(alphonse) — получает лок gaston
A: возвращается из обоих методов, открывая оба лока
G: gaston.bow(alphonse) — получает лок gaston
G: alphonse.bowBack(gaston) — получает лок alphonse
G: возвращается из обоих методов, открывая оба лока
Bu ýagdaýda sapaklaryň özara ýapylmagy ýok. Mysal üçin, başga bir sapagyň ýerine ýetirilmegine wagt tapmaga mümkinçilik berýän käbir usul goşuldy. Netije bir wagtyň özünde bolup geçýän wakalaryň tertibine (meýilleşdirilen tertip ýa-da ýerine ýetiriş tizligi) bagly bolanda, şeýle proses rus dilinde ýaryş ýagdaýy - “ýaryş ýagdaýy” diýilýär. Racehli ýaryş şertleri petik döredip bilmez, ýöne meniň tejribämde diňe ýaryş şertleri kynçylyklara sebäp bolýar. Postedazan: Deýw Lillethun
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION