JavaRush /Java Blog /Random-TK /Java-ny sapak bilen bozup bilmersiňiz: II bölüm - sinhron...
Viacheslav
Dereje

Java-ny sapak bilen bozup bilmersiňiz: II bölüm - sinhronizasiýa

Toparda çap edildi

Giriş

Şeýlelik bilen, Java-da sapaklaryň bardygyny bilýäris, " Java-ny bir mowzuk bilen zaýalap bilmersiňiz: I bölüm - sapaklar " synynda okap bilersiňiz. Bir wagtyň özünde işlemek üçin sapaklar zerurdyr. Şonuň üçin sapaklaryň haýsydyr bir görnüşde biri-biri bilen täsirleşmegi gaty ähtimal. Munuň nähili bolup geçýändigini we haýsy esasy gözegçiliklerimiziň bardygyna düşüneliň. Java-ny sapak bilen bozup bilmersiňiz: II bölüm - sinhronizasiýa - 1

Hasyl beriň

Thread.yield () usuly syrly we seýrek ulanylýar. Internetde düşündirişiniň köp dürli görnüşleri bar. Käbir sapaklaryň ileri tutulýan ugurlaryny göz öňünde tutup aşak süýşjek sapaklaryň nobaty hakda ýazýan derejesine çenli. Kimdir biri sapagyň işleýşinden işlemäge geçjekdigini ýazýar (bu ýagdaýlara bölünişik ýok bolsa we Java olaryň arasynda tapawutlandyrmaýar). Emma hakykatda hemme zat has näbelli we bir manyda has ýönekeý. Java-ny sapak bilen bozup bilmersiňiz: II bölüm - sinhronizasiýa - 2Usul resminamalary mowzugynda " JDK-6416721: (spes sapagy) Thread.yield () javadocyield " düzediň . Ony okasaňyz, aslynda usulyň diňe Java sapak meýilleşdirijisine bu sapagyň ýerine ýetiriş wagtynyň az bolup biljekdigi belli bolýar. Actuallyöne aslynda näme boljakdygy, meýilleşdirijiniň maslahaty eşidip-eşitmezligi we umuman näme etjekdigi JVM-iň we operasiýa ulgamynyň durmuşa geçirilmegine baglydyr. Ora-da başga käbir faktorlardan. Allhli bulaşyklyk, Java diliniň ösüşi wagtynda köp okalmagy täzeden gözden geçirmek bilen baglanyşyklydyr. " Java Thread.yield () " -e gysgaça giriş . yield

Uky - Uky sapagy

Bir sapak ýerine ýetirilende uklap biler. Bu, beýleki sapaklar bilen iň ýönekeý täsirleşme görnüşidir. Java kody ýerine ýetirilýän Java wirtual maşynynyň gurlan operasiýa ulgamynyň, “Thread Planuler” atly öz sapak meýilnamasy bar. Haýsy sapagyň haçan işlemelidigini özi çözýär. Programmist bu meýilnamaçy bilen göni Java kodundan aragatnaşyk saklap bilmeýär, ýöne JVM-iň üsti bilen meýilleşdirijiden sapagy biraz saklamagyny we "uklamagyny" sorap biler. " Thread.sleep () " we " Köp okalmagyň nähili işleýändigi " makalalarynda has köp okap bilersiňiz . Mundan başga-da, Windows OS-da sapaklaryň nähili işleýändigini bilip bilersiňiz: " Windows sapagynyň içki bölegi ". Indi muny öz gözlerimiz bilen göreris. Aşakdaky kody faýla ýazalyň HelloWorldApp.java:
class HelloWorldApp {
    public static void main(String []args) {
        Runnable task = () -> {
            try {
                int secToWait = 1000 * 60;
                Thread.currentThread().sleep(secToWait);
                System.out.println("Waked up");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        };
        Thread thread = new Thread(task);
        thread.start();
    }
}
Görşüňiz ýaly, 60 sekunt garaşýan bir wezipe bar, şondan soň programma gutarýar. Biz düzýäris javac HelloWorldApp.javawe işleýäris java HelloWorldApp. Aýry penjirede işe girizmek has gowudyr. Mysal üçin, Windows-da şeýle bolardy : start java HelloWorldApp. Jps buýrugyny ulanyp, prosesiň PID-i tapýarys we ulanyp, sapaklaryň sanawyny açýarys jvisualvm --openpid pidПроцесса: Java-ny sapak bilen bozup bilmersiňiz: II bölüm - sinhronizasiýa - 3Görşüňiz ýaly, sapagymyz Uky ýagdaýyna girdi. Aslynda häzirki sapagy uklamak has owadan edilip bilner:
try {
	TimeUnit.SECONDS.sleep(60);
	System.out.println("Waked up");
} catch (InterruptedException e) {
	e.printStackTrace();
}
Everywherehli ýerde işleýändigimize göz ýetiren bolsaňyz gerek InterruptedException? Munuň sebäbine düşüneliň.

Bir sapagy kesmek ýa-da Thread.interrupt

Thingeri gelende aýtsak, sapak düýşde garaşyp durka, kimdir biri bu garaşmagy kesmek isläp biler. Bu ýagdaýda şeýle kadadan çykma edýäris. Thread.stopBu usul könelişen diýlip yglan edilenden soň edildi , ýagny köne we ulanmak üçin islenmeýän. Munuň sebäbi, usul diýlende, stopsapak diňe "öldürilipdi", bu bolsa öňünden aýdyp bolmaýardy. Akymyň haçan saklanjakdygyny bilip bilmedik, maglumatlaryň yzygiderliligini kepillendirip bilmedik. Faýla maglumat ýazýandygyňyzy, soň bolsa akymyň ýok edilendigini göz öňüne getiriň. Şol sebäpden, akymy öldürmek däl-de, kesilmelidigini habar bermek has mantykly bolar diýen karara geldik. Muňa nädip reaksiýa bildirmeli, akymyň özi. Has giňişleýin maglumaty Oracle-yň " Näme üçin Thread.stop köneldi? " Bir mysala seredeliň:
public static void main(String []args) {
	Runnable task = () -> {
		try {
			TimeUnit.SECONDS.sleep(60);
		} catch (InterruptedException e) {
			System.out.println("Interrupted");
		}
	};
	Thread thread = new Thread(task);
	thread.start();
	thread.interrupt();
}
Bu mysalda 60 sekunt garaşmarys, derrew 'Arakesme' çap ederis. Sebäbi sapagyň usuly diýdik interrupt. Bu usul "arakesme ýagdaýy" diýilýän içki baýdagy kesgitleýär. Eachagny, her sapakda gönüden-göni girip bolmaýan içki baýdak bar. Emma bu baýdak bilen täsirleşmegiň ýerli usullary bar. Emma bu ýeke-täk ýol däl. Bir sapak ýerine ýetirilende bolup biler, bir zada garaşman, diňe hereketleri ýerine ýetirip biler. Itöne bu işi belli bir wagtda tamamlamak isleýändiklerini üpjün edip biler. Mysal üçin:
public static void main(String []args) {
	Runnable task = () -> {
		while(!Thread.currentThread().isInterrupted()) {
			//Do some work
		}
		System.out.println("Finished");
	};
	Thread thread = new Thread(task);
	thread.start();
	thread.interrupt();
}
Aboveokardaky mysalda, sapagyň whiledaşy kesilýänçä aýlawyň işlejekdigini görüp bilersiňiz. Päsgelçiliksiz baýdak hakda bilmeli möhüm zat , ony tutsak InterruptedException, baýdak isInterruptedtäzeden dikeldiler, soň bolsa isInterruptedýalan gaýdyp geler. Mundan başga-da, häzirki sapak - Thread.interrupted () üçin ulanylýan sapak synpy üçin statiki usul bar , ýöne bu usul baýdagy ýalana öwürýär! " Sapagyň kesilmegi " bölüminde has köp okap bilersiňiz .

Goşulyň - Başga bir sapagyň gutarmagyna garaşýarys

Iň ýönekeý garaşma görnüşi, başga bir sapagyň gutarmagyna garaşýar.
public static void main(String []args) throws InterruptedException {
	Runnable task = () -> {
		try {
			TimeUnit.SECONDS.sleep(5);
		} catch (InterruptedException e) {
			System.out.println("Interrupted");
		}
	};
	Thread thread = new Thread(task);
	thread.start();
	thread.join();
	System.out.println("Finished");
}
Bu mysalda täze sapak 5 sekunt uklar. Şol bir wagtyň özünde, esasy sapak uky sapagy oýanyp, işini gutarýança garaşar. JVisualVM-e göz aýlasaňyz, sapagyň ýagdaýy şeýle bolar: Java-ny sapak bilen bozup bilmersiňiz: II bölüm - sinhronizasiýa - 4Gözegçilik gurallarynyň kömegi bilen sapak bilen nämeleriň bolup geçýändigini görüp bilersiňiz. Usul gaty ýönekeý, sebäbi java kody bilen atlandyrylan sapak diri wagtynda joinýerine ýetirilýän usul . waitIp ölenden soň (ahyrynda) garaşmak bes edilýär. Bu usulyň tutuş jadysy join. Şonuň üçin iň gyzykly bölüme geçeliň.

Konsepsiýa gözegçisi

Köp okaýyşda Monitor ýaly bir zat bar. Umuman aýdylanda, monitor sözi latyn dilinden “gözegçi” ýa-da “gözegçi” hökmünde terjime edilýär. Bu makalanyň çäginde, manysyny ýatda saklamaga synanyşarys we isleýänler üçin jikme-jiklikler üçin baglanyşyklardan materiallara girmegiňizi haýyş edýärin. Syýahatymyzy Java diliniň spesifikasiýasy bilen, ýagny JLS: " 17.1. Sinhronizasiýa " bilen başlalyň . Aşakdakylary aýdýar: Java-ny sapak bilen bozup bilmersiňiz: II bölüm - sinhronizasiýa - 5Görnüşi ýaly, sapaklaryň arasynda sinhronlamak üçin Java “Monitor” atly belli bir mehanizmi ulanýar. Her bir obýektiň özi bilen baglanyşykly monitor bar we sapaklar ony gulplap ýa-da açyp biler. Ondan soň, Oracle web sahypasynda: “ Içki gulplar we sinhronizasiýa ” okuw gollanmasyny taparys . Bu gollanma, Java-da sinhronlaşmagyň içerki gulp ýa-da monitor gulpy diýlip atlandyrylýan içerki guramanyň töwereginde gurulýandygyny düşündirýär. Köplenç şeýle gulp diňe “monitor” diýilýär. Şeýle hem, Java-daky her bir obýektiň özüne bagly içerki gulpuň bardygyny ýene bir gezek görýäris. " Java - Içki gulplar we sinhronizasiýa " okap bilersiňiz . Ondan soň, Java-daky bir obýektiň monitor bilen nädip baglanyşyp biljekdigine düşünmek möhümdir. Java-daky her bir obýektiň sözbaşysy bar - programmistden koddan elýeterli däl, ýöne wirtual maşyn obýektler bilen dogry işlemeli içerki metadata görnüşi. Obýektiň sözbaşysyna meňzeş MarkWord girýär: Java-ny sapak bilen bozup bilmersiňiz: II bölüm - sinhronizasiýa - 6

https://edu.netbeans.org/contrib/slides/java-overview-and-java-se6.pdf

Habrdan bir makala bu ýerde gaty peýdaly: “ multöne köp okamak nädip işleýär? I bölüm: sinhronizasiýa .” Bu makalada, JDK bugtaker-den meseleler blokunyň gysgaça mazmunyndan düşündiriş goşmaly: “ JDK-8183909 ”. Şol bir zady " JEP-8183909 " -da okap bilersiňiz . Şeýlelik bilen, Java-da monitor bir obýekt bilen baglanyşdyrylýar we sapak bu sapagy ýapyp biler ýa-da "gulp al" diýýärler. Iň ýönekeý mysal:
public class HelloWorld{
    public static void main(String []args){
        Object object = new Object();
        synchronized(object) {
            System.out.println("Hello World");
        }
    }
}
Şeýlelik bilen, açar söz ulanyp, synchronizedhäzirki sapak (bu kod setirleri ýerine ýetirilýär) obýekt bilen baglanyşykly monitory ulanmaga objectwe “gulp almaga” ýa-da “monitory ele almaga” synanyşýar (ikinji warianty has amatly). Monitor üçin jedel ýok bolsa (ýagny başga hiç kim şol bir obýektde sinhronlamak islemeýär), Java "ikitaraplaýyn gulplama" diýilýän optimizasiýany amala aşyryp biler. Mark Word-daky obýektiň ady degişli belligi we monitoryň haýsy sapaga berkidilendigini öz içine alar. Monitory alanyňyzda üstüňi azaldar. Monitor öňem başga bir sapak bilen daňylan bolsa, bu gulplamak ýeterlik däl. JVM indiki gulplama görnüşine geçýär - esasy gulplama. Deňeşdirmek we swap (CAS) amallaryny ulanýar. Şol bir wagtyň özünde, Mark Word-daky sözbaşy indi Mark Word-yň özüni saklamaýar, ýöne JVM-iň esasy gulplamany ulanýandygymyza düşünmegi üçin ammar + belligi üýtgedilýär. Birnäçe sapagyň monitory üçin jedel bar bolsa (biri monitory ele aldy, ikinjisi monitoryň çykmagyna garaşýar), Mark Word-daky bellik üýtgeýär we Mark Word monitora salgylanma saklap başlaýar obýekt - JVM-iň käbir içerki birligi. JEP-de aýdylyşy ýaly, bu ýagdaýda bu guramany saklamak üçin “Native Heap” ýat meýdanynda boş ýer talap edilýär. Bu içerki guramanyň saklanýan ýerine baglanyşyk Mark Word obýektinde ýerleşer. Şeýlelik bilen, görşümiz ýaly, monitor hakykatdanam köp sapaklaryň umumy çeşmelere sinhronlaşmagyny üpjün etmegiň mehanizmidir. JVM-iň arasynda geçýän bu mehanizmiň birnäçe ýerine ýetirilişi bar. Şonuň üçin ýönekeýlik üçin, monitor hakda aýdanymyzda, aslynda gulplar hakda gürleşýäris. Java-ny sapak bilen bozup bilmersiňiz: II bölüm - sinhronizasiýa - 7

Sinhronlaşdyrylan we gulp bilen garaşýan

Monitor düşünjesi, öň görşümiz ýaly, “sinhronizasiýa bloky” (ýa-da atlandyrylyşy ýaly möhüm bölüm) düşünjesi bilen ýakyndan baglanyşyklydyr. Bir mysala seredeliň:
public static void main(String[] args) throws InterruptedException {
	Object lock = new Object();

	Runnable task = () -> {
		synchronized (lock) {
			System.out.println("thread");
		}
	};

	Thread th1 = new Thread(task);
	th1.start();
	synchronized (lock) {
		for (int i = 0; i < 8; i++) {
			Thread.currentThread().sleep(1000);
			System.out.print("  " + i);
		}
		System.out.println(" ...");
	}
}
Bu ýerde esasy sapak ilki meseläni täze sapaga iberýär, soňra derrew gulpy “ele alýar” we onuň bilen uzak operasiýa edýär (8 sekunt). Bu wagtyň dowamynda, wezipe ýerine ýetirilmegi üçin bloklara girip bilmeýär synchronized, sebäbi gulp eýýäm eýeledi. Bir sapak gulp alyp bilmese, monitorda garaşar. Ol alan badyna ýerine ýetirilmegini dowam etdirer. Bir sapak monitordan çykanda, gulpy boşadýar. JVisualVM-de şeýle görüner: Java-ny sapak bilen bozup bilmersiňiz: II bölüm - sinhronizasiýa - 8Görşüňiz ýaly, JVisualVM-de ýagdaý "Monitor" diýilýär, sebäbi sapak petiklenýär we monitory alyp bilmeýär. Şeýle hem koddaky sapagyň ýagdaýyny bilip bilersiňiz, ýöne bu döwletiň ady meňzeş bolsa-da, JVisualVM terminlerine gabat gelmeýär. Bu ýagdaýda th1.getState()aýlaw , GARAŞANfor gaýdyp geler , sebäbi Aýlaw işleýärkä, monitor sapak bilen meşgullanýar we sapak petiklenýär we gulp yzyna gaýtarylýança işlemegini dowam etdirip bilmeýär. Sinhronizasiýa bloklaryndan başga-da, tutuş usul sinhronlaşdyrylyp bilner. Mysal üçin, synpdan bir usul : lockmainth1HashTable
public synchronized int size() {
	return count;
}
Wagtyň birliginde bu usul diňe bir sapak bilen ýerine ýetiriler. Weöne bize gulp gerek, şeýlemi? Hawa, maňa gerek. Obýekt usullary bolan ýagdaýynda gulp bolar this. Bu mowzukda gyzykly çekişme bar: " Sinhronlaşdyrylan blokyň ýerine sinhronlaşdyrylan usuly ulanmagyň artykmaçlygy barmy? ". Usul statik bolsa, gulp bolmaz this(sebäbi statiki usul üçin bolup bilmez this), ýöne synp obýekti (Mysal üçin Integer.class).

Monitora garaşyň we garaşyň. Allhli usullary habar beriň we habar beriň

Tekstiň monitora birikdirilen başga bir garaşma usuly bar. sleepMundan tapawutlylykda join, ony diňe atlandyryp bolmaz. Onuň ady wait. waitUsul, garaşmak isleýän obýektimizde ýerine ýetirilýär . Mysal göreliň:
public static void main(String []args) throws InterruptedException {
	    Object lock = new Object();
	    // task будет ждать, пока его не оповестят через lock
	    Runnable task = () -> {
	        synchronized(lock) {
	            try {
	                lock.wait();
	            } catch(InterruptedException e) {
	                System.out.println("interrupted");
	            }
	        }
	        // После оповещения нас мы будем ждать, пока сможем взять лок
	        System.out.println("thread");
	    };
	    Thread taskThread = new Thread(task);
	    taskThread.start();
        // Ждём и после этого забираем себе лок, оповещаем и отдаём лок
	    Thread.currentThread().sleep(3000);
	    System.out.println("main");
	    synchronized(lock) {
	        lock.notify();
	    }
}
JVisualVM-de şeýle bolar: Munuň nähili işleýändigine düşünmek üçin usullaryň degişlidigini Java-ny sapak bilen bozup bilmersiňiz: II bölüm - sinhronizasiýa - 10ýadyňyzdan çykarmaly dälsiňiz . Ip bilen baglanyşykly usullaryň bolmagy geň zat . Emma jogap şu ýerde. Javaadymyzda bolsa, Java-daky her bir obýektiň sözbaşysy bar. Erazgyda dürli hyzmat maglumatlary, şol sanda monitor hakda - gulplama ýagdaýy baradaky maglumatlar bar. Rememberadymyzda bolsa, her bir obýektiň (meselem, her mysal) içerki gulp diýilýän içerki JVM guramasy bilen baglanyşygy bar, oňa monitor hem diýilýär. Aboveokardaky mysalda, iş bilen baglanyşykly monitorda sinhronizasiýa blokyna girýändigimizi düşündirýär . Bu monitorda gulp almak mümkin bolsa, onda . Bu meseläni ýerine ýetirýän sapak monitory boşadar , ýöne monitorda habara garaşýan sapaklaryň nobatyna goşular . Bu sapaklaryň nobatyna düýp manyny has dogry görkezýän WAIT-SET diýilýär. Bu nobata däl. Threadüplük ýumuş meselesi bilen täze sapak döredýär, başlaýar we 3 sekunt garaşýar. Bu, ýokary ähtimallyk bilen, sapagyň öňündäki gulpy tutup , monitorda nobata durmaga mümkinçilik berýär. Ondan soň sapagyň özi sinhronizasiýa blokuna girýär we monitordaky sapak barada habarnamany ýerine ýetirýär. Duýduryş iberilenden soň, sapak monitory çykarýar we täze sapak (öň garaşýardy) monitoryň çykmagyna garaşandan soň ýerine ýetirilmegini dowam etdirýär. Sapaklaryň diňe birine ( ) ýa-da nobatdaky ähli sapaklara birbada ( ) habar iberip bolýar . " Java-da habar bermek () we notifyAll () arasyndaky tapawut " -da has köp okap bilersiňiz . Duýduryş buýrugynyň JVM ýerine ýetirilişine baglydygyny bellemelidiris. " Açlygy nädip habar bermek we habar bermek bilen çözmeli? " -Da has köp okap bilersiňiz . Sinhronizasiýa obýekti görkezmän ýerine ýetirilip bilner. Kodyň aýratyn bölümi sinhronlanman, tutuş bir usul bilen amala aşyrylyp bilner. Mysal üçin, statiki usullar üçin gulp synp obýekti bolar (üsti bilen alynýar ): waitnotifyjava.lang.ObjectObjectlockwaitlocklockmainmainmainlockmainlocklocknotifynotifyAll.class
public static synchronized void printA() {
	System.out.println("A");
}
public static void printB() {
	synchronized(HelloWorld.class) {
		System.out.println("B");
	}
}
Gulplary ulanmak meselesinde iki usul hem birmeňzeş. Usul statik däl bolsa, sinhronizasiýa tok instance, ýagny şoňa görä amala aşyrylar this. Theeri gelende aýtsak, bu usuly ulanyp, getStatesapak statusyny alyp bilersiňiz diýdik. Ine, ine, monitor tarapyndan nobata durýan bir sapak, usul waitgaraşmagyň möhletini kesgitlän bolsa, garaşmak ýa-da TIMED_WAITING bolar. Java-ny sapak bilen bozup bilmersiňiz: II bölüm - sinhronizasiýa - 11

Bir sapagyň ömri

Görşümiz ýaly, akym durmuşyň ýagdaýyny üýtgedýär. Aslynda, bu üýtgeşmeler sapagyň ýaşaýyş siklidir. Bir sapak ýaňy döredilende, T NEWZE statusy bolýar. Bu ýagdaýda entek başlamady we Java sapak meýilnamasy täze sapak hakda entek hiç zat bilmeýär. Saplar meýilleşdirijisiniň bir sapak hakda bilmegi üçin jaň etmeli thread.start(). Soňra sapak RUNNABLE ýagdaýyna girer. Internetde “Runnable” we “Running” ýagdaýlary bölünen köp nädogry shemalar bar. Emma bu ýalňyşlyk, sebäbi ... Java "işlemäge taýyn" we "işleýän" ýagdaýlary tapawutlandyrmaýar. Bir sapak diri, ýöne işjeň däl bolsa (Işledip bolmaýar), iki ýagdaýyň birinde bolýar:
  • GARAŞAN - goralýan bölüme girmegine garaşýar, ýagny blokirleme synchonized.
  • Garaşmak - şertlere esaslanyp başga bir sapaga garaşýar. Trueagdaý dogry bolsa, sapak meýilleşdirijisi sapagy başlaýar.
Bir sapak wagt bilen garaşýan bolsa, TIMED_WAITING ýagdaýynda. Eger sapak indi işlemeýän bolsa (üstünlikli ýa-da kadadan çykma bilen), TERMINATED ýagdaýyna geçýär. Bir sapagyň ýagdaýyny (ýagdaýyny) bilmek üçin usul ulanylýar getState. isAliveMundan başga-da , sapaklar ýapylmasa, hakyky yzyna gaýtarylýan usul bar .

“LockSupport” we sapak duralgasy

Java 1.6-dan bäri “LockSupport” atly gyzykly mehanizm bardy . Java-ny sapak bilen bozup bilmersiňiz: II bölüm - sinhronizasiýa - 12Bu synp, her bir sapak bilen "rugsat" ýa-da rugsady baglanyşdyrýar. parkÇagyryş wagtynda şol rugsady alyp, rugsat bar bolsa, jaň usuly derrew gaýdyp gelýär. Otherwiseogsam petiklenýär. Usula jaň etmek, unparkeýýäm ýok bolsa, rugsat berýär. Diňe 1 Rugsat bar. Java API-de LockSupportbelli Semaphore. Simpleönekeý bir meselä seredeliň:
import java.util.concurrent.Semaphore;
public class HelloWorldApp{

    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(0);
        try {
            semaphore.acquire();
        } catch (InterruptedException e) {
            // Просим разрешение и ждём, пока не получим его
            e.printStackTrace();
        }
        System.out.println("Hello, World!");
    }
}
Bu kod hemişelik garaşar, sebäbi semaforda 0 rugsat bar. Kod bilen çagyrylanda acquire(meselem, rugsat soraň), sapak rugsat alýança garaşýar. Garaşýandygymyz sebäpli, ony gaýtadan işlemäge borçly InterruptedException. Gyzykly tarapy, semafor aýratyn sapak ýagdaýyny amala aşyrýar. JVisualVM-e göz aýlasak, döwletimiziň garaşmak däl-de, seýilgähdigini göreris. Java-ny sapak bilen bozup bilmersiňiz: II bölüm - sinhronizasiýa - 13Başga bir meselä seredeliň:
public static void main(String[] args) throws InterruptedException {
        Runnable task = () -> {
            //Запаркуем текущий поток
            System.err.println("Will be Parked");
            LockSupport.park();
            // Как только нас распаркуют - начнём действовать
            System.err.println("Unparked");
        };
        Thread th = new Thread(task);
        th.start();
        Thread.currentThread().sleep(2000);
        System.err.println("Thread state: " + th.getState());

        LockSupport.unpark(th);
        Thread.currentThread().sleep(2000);
}
Sapagyň ýagdaýy garaşýar, ýöne JVisualVM waitbilen synchronizedtapawudyny parktapawutlandyrýar LockSupport. Bu näme üçin beýle möhüm LockSupport? Geliň, ýene-de Java API-e ýüzleneliň we “Döwlet garaşmagyna” seredeliň . Görşüňiz ýaly, oňa girmegiň diňe üç ýoly bar. 2 ýol - bu waitwe join. Üçünjisi LockSupport. Java-daky gulplar şol bir ýörelgelere esaslanýar LockSupportwe has ýokary derejeli gurallary görkezýär. Birini ulanmaga synanyşalyň. Mysal üçin, seredeliň ReentrantLock:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class HelloWorld{

    public static void main(String []args) throws InterruptedException {
        Lock lock = new ReentrantLock();
        Runnable task = () -> {
            lock.lock();
            System.out.println("Thread");
            lock.unlock();
        };
        lock.lock();

        Thread th = new Thread(task);
        th.start();
        System.out.println("main");
        Thread.currentThread().sleep(2000);
        lock.unlock();
    }
}
Öňki mysallarda bolşy ýaly, bu ýerde hemme zat ýönekeý. lockkimdir biriniň çeşme goýbermegine garaşýar. mainJVisualVM-e göz aýlasak, täze sapagyň sapak gulplanýança saklanjakdygyny göreris . Gulplar barada has giňişleýin maglumaty şu ýerden okap bilersiňiz: " Java-da köp okalýan programmirleme. Ikinji bölüm. Üýtgeýän obýektlere girişi sinhronlamak " we " Java Lock API. Ulanyş teoriýasy we mysaly ." Gulplaryň ýerine ýetirilişine has gowy düşünmek üçin Phazer hakda " Phaser Class " synyny okamak peýdalydyr . Dürli sinhronizatorlar barada aýdanyňda, Habräniň “ Java.util.concurrent. * Sinhronizatorlara salgylanma ” atly makalany okamaly .

Jemi

Bu gözden geçirilişde, sapaklaryň Java-da täsir etmeginiň esasy usullaryna göz aýladyk. Goşmaça material: # Wiaçeslaw
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION