Di Java, blok Disegerakkan membantu dalam melaksanakan penyegerakan pada mana-mana sumber tertentu fungsi atau kaedah. Jika terdapat 100 baris kod(LOC) dan penyegerakan perlu dilakukan hanya untuk 10 baris, maka blok yang disegerakkan boleh digunakan. Disegerakkan boleh digunakan sebagai kata kunci, kaedah dan blok. Dalam tutorial ini, kami akan membincangkan blok yang disegerakkan secara terperinci.
Mulakan Kursus Pembangunan Perisian Percuma Anda
Pembangunan web, bahasa pengaturcaraan, ujian perisian & lain-lain
Sintaks:
Sintaks blok yang disegerakkan adalah seperti yang ditunjukkan di bawah:
Synchronized( lo) { //statements that have to be synchronized }
Di sini, lihatlah objek kunci
Seperti yang telah dibincangkan, blok Disegerakkan membantu dalam melaksanakan penyegerakan pada mana-mana sumber tertentu fungsi atau kaedah. Apabila utas perlu melaksanakan baris yang disegerakkan di dalam blok disegerakkan, adalah wajib untuk memperoleh kunci pada monitor objek kunci yang disebutkan dalam sintaks di atas. Pada satu masa, hanya 1 utas boleh memperoleh monitor objek kunci. Setiap utas perlu menunggu sehingga utas yang pada masa ini memegang kunci menyelesaikan pelaksanaan dan melepaskannya.
Begitu juga, kata kunci disegerakkan memastikan bahawa pada satu-satu masa, hanya 1 utas akan melaksanakan baris kod dalam blok segerak, yang seterusnya menghalang lebih daripada satu utas daripada merosakkan data yang dikongsi dalam blok.
Andaikan kaedah mengandungi 500 LOC(baris kod), tetapi terdapat hanya 20 baris kod yang memegang bahagian kritikal (CS) kod. Iaitu, 20 baris ini boleh mengubah atau mengubah keadaan objek. Jadi penyegerakan boleh dilakukan pada 20 baris fungsi kod ini untuk mengelakkan sebarang perubahan dalam keadaan objek dan memastikan bahawa utas lain melaksanakan 480 baris lain dalam kaedah tertentu tanpa sebarang selingan.
Sekarang, mari kita lihat beberapa contoh program pada blok disegerakkan di Java.
Program Java untuk melaksanakan blok disegerakkan
Kod:
class Testsmple{ void printTestsmple(int n) { //start of synchronized block synchronized(this) { System.out.println("The output of synchronized block is: "); for( int i=1 ; i<=4 ; i++ ) { System.out.println(n*i); //exception handling try { Thread.sleep(500); } catch(Exception exc) { System.out.println(exc) ; } } } } //end } class T1 extends Thread { Testsmple t; T1(Testsmple t) { this.t=t; } public void run() { t.printTestsmple(10); } } class T2 extends Thread { Testsmple t; T2(Testsmple t) { this.t=t; } public void run() { t.printTestsmple(200); } } public class SyncBlockExample { public static void main(String args[]) { // create only one object Testsmple ob = new Testsmple(); //objects of threads T1 t1=new T1(ob); T2 t2=new T2(ob); //start the threads t1 and t2 t1.start(); t2.start(); } }
Output:
Dalam program ini, dua utas t1 dan t2, digunakan di mana setiap satu daripadanya mempunyai kaedah printTestsmple yang memanggil kaedah disegerakkan. Input benang 1 untuk printTestsmple ialah 10, dan input benang 2 ialah 200. Hasilnya, dapat dilihat bahawa output blok disegerakkan benang pertama ialah 10, 20, 30, 40. Pada masa yang sama, hasil blok disegerakkan benang 2 ialah 200, 400, 600, 800. Selain itu, terdapat baris "Output blok disegerakkan ialah:" yang akan dicetak antara hasil setiap utas.
Program Java untuk melaksanakan blok disegerakkan dengan bantuan menggunakan kelas tanpa nama.
Kod:
class Testsmple{ void printTestsmple(int n) { //start of synchronized block synchronized(this) { System.out.println("The output of synchronized block is: "); for( int i=1 ; i<=4 ; i++ ) { System.out.println(n*i); //exception handling try { Thread.sleep(500); } catch(Exception exc) { System.out.println(exc) ; } } } } //end } public class SyncBlockExample { //main method public static void main(String args[]) { //create only one object final Testsmple obj = new Testsmple() ; //create thread th1 Thread th1=new Thread() { public void run() { obj.printTestsmple(10) ; } } ; //create thread th2 Thread th2=new Thread() { public void run() { obj.printTestsmple(200); } } ; th1.start() ; th2.start() ; }}
Output:
Dalam program ini juga, dua utas t1 dan t2, digunakan di mana setiap satu daripadanya mempunyai kaedah printTestsmple yang memanggil kaedah disegerakkan. Input benang 1 untuk printTestsmple ialah 10, dan input benang 2 ialah 200. Hasilnya, dapat dilihat bahawa output blok disegerakkan benang pertama ialah 10, 20, 30, 40. Pada masa yang sama, hasil blok disegerakkan benang 2 ialah 200, 400, 600, 800. Selain itu, terdapat baris "Output blok disegerakkan ialah:" yang akan dicetak antara hasil setiap utas. Satu-satunya perbezaan ialah kehadiran kelas tanpa nama dalam program ini.
Atur cara Java untuk melaksanakan blok disegerakkan.
import java.util.*; class ABC { String nm = ""; public int cnt = 0; public void samplename(String stringexample, List<String>li) { // In order to change the name at a time, only 1 thread is permitted synchronized(this) { nm = stringexample; cnt++; } li.add(stringexample); } } public class SyncBlockExample { //main method public static void main (String[] args) { //create an object for the class ABC ABC obj = new ABC(); //create a list List<String>li = new ArrayList<String>(); //call the method using the object created obj.samplename("Anna Sam", li); System.out.println(obj.nm); } }
Output:
Dalam program ini, kelas ABC dicipta dengan kaedah yang disegerakkan di dalam nama sampel kaedah. Rentetan "Anna Sam" dihantar sebagai input untuk memanggil nama sampel kaedah. Semasa melaksanakan kod, rentetan “Anna Sam” akan dicetak.
Beberapa kelebihan diberikan di bawah:
Atas ialah kandungan terperinci Blok Disegerakkan di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!